Você está na página 1de 71

Banco de Dados UNIVAP - CTI

1 – INTRODUÇÃO

Neste curso estaremos estudando conceitos e práticas normalmente utilizadas quando projetamos em
banco de dados relacionais.

Vamos utilizar neste curso o Sistema Gerenciador de Banco de Dado (SGBD) SQL-Server 2005
Express Edition. Vale ressaltar que no mercado existem vários softwares desenvolvidos para gerenciar banco
de dados, tais como:
• Access
• MySQL
• Postgree (gratuito)
• Oracle
• Paradox
• Firebird (gratuito)
• Etc...

O SQL-Server 2005 Express Edition é um software oferecido gratuitamente no site da Microsoft. Você
poderá baixá-lo diretamente do seguinte endereço:
http://www.microsoft.com/downloads/details.aspx?familyid=4C6BA9FD-319A-4887-BC75-3B02B5E48A40&displaylang=en

Cuidado, pois existem outros pacotes do SQL-SERVER 2005 EXPRESS, porém não oferecem
ADVANCED SERVICES (serviços avançados). Estes serviços nos permitem manter os bancos de dados
armazenados em um servidor.

Esta versão será usada neste módulo do curso, pois, trata-se de um software LIVRE, ou seja, você não
precisará ter uma licença para usá-lo em seu computador.

Antes de falarmos do SGBD SQL-Server, temos que revisar vários conceitos relevantes sobre banco
de dados.

Um banco de dados relacional, gerado por um SGBD, possui várias TABELAS que se relacionam entre
si, através de CAMPOS. Daí se origina o nome dado a este tipo de banco de dados, RELACIONAL.

Os CAMPOS das tabelas serão utilizados para armazenar REGISTROS. Vale dizer que cada registro é
composto por CARACTERES.

O esquema abaixo ilustra os conceitos abordados acima:


Banco de Dados  Tabelas  Campos  Registros  Caracteres

Professor: Alberson Wander Página: 1


Banco de Dados UNIVAP - CTI

2 – VOCABULÁRIOS USADOS EM BANCO DE DADOS

Quando consultamos qualquer bibliografia de banco de dados, o vocabulário utilizado pelos autores
são os seguintes:

ENTIDADES  São as tabelas do banco de dados;


ATRIBUTOS  São os campos das entidades;
DOMÍNIOS  São todos os valores possíveis de dados armazenados em um atributo. Exemplo: Todos os
códigos de peças armazenados no atributo CODPEÇA.
TUPLA  Cada registro armazenado numa entidade; Lembre-se que um registro refere-se ao conjunto de
dados armazenados em todas os atributos de uma tabela.
CHAVE PRIMÁRIA  um ou mais atributos, usados para identificar e unificar as tuplas armazenadas;
CHAVE ESTRANGEIRA  atributo existente em uma entidade filho, ou seja, entidade que recebe dados de
outra entidade em um relacionamento. A entidade FILHO, no relacionamento, deve possuir os mesmos
atributos da chave primária da tabela PAI, e estes devem ser do mesmo tipo e tamanho, a fim de tornar
possível o relacionamento entre as tabelas.

3 – POR QUE USAR UM SISTEMA GERENCIADOR DE BANCO DE DADOS?

A resposta para essa pergunta pode ser dada baseada nas seguintes vantagens:
• É compacto  Não há necessidade de arquivos de papéis;
• Acesso rápido  Os computadores podem acessar rapidamente qualquer informação
armazenada num Banco de dados (B.D.).
• Menos trabalho braçal  Os funcionários de empresas não precisam preocupar-se
com o arquivamento de fichas, pois o computador é responsável por fazê-lo.
• Fluxo corrente  informações certas e atualizadas a qualquer momento, basta pedir.

4 – VANTAGENS EM USARMOS BANCO DE DADOS RELACIONAIS

Um banco de dados deve oferecer para empresas algumas vantagens. Estas vantagens facilitarão a
tomada de decisões e permitirão a armazenagem de dados confiáveis. Veja as vantagens:
• Redução na redundância de dados  eliminar repetições DESNECESSÁRIAS em
atributos das entidades.
• Compartilhamento de dados pelas aplicações novas e as já existentes;
• Padronização de padrões  esta tarefa refere-se à padronização de dados e
documentos dentro da empresa, para facilitar o compartilhamento e a compreensão de
dados;
• Restrições de segurança  referem-se aos controles de acessos aos usuários do
banco de dados (pessoas ou aplicações).
• Manter a integridade de dados  possuir nas entidades do banco de dados
informações atualizadas e consistentes, para tomada de decisões dentro da empresa.

5 – NORMALIZAÇÕES DE ENTIDADES DO BANCO DE DADOS

Quando estamos criando as tabelas de um banco de dados, devemos tomar o cuidado de retirarmos
dessas os campos que armazenarão registros redundantes desnecessários. A esse processo damos o nome
de NORMALIZAÇÃO. Em alguns momentos a redundância de dados torna-se necessária, como veremos
adiante.

Normalizar, diante do que foi descrito acima, nada mais é do que:


A) MINIMIZAR REDUNDÂNCIAS e INCONSISTÊNCIAS de dados;
B) FACILITAR A MANIPULAÇÃO DO BANCO DE DADOS;
C) FACILITAR A MANUTENÇÃO DOS DADOS NO BANCO DE DADOS.

Antes de normalizarmos as ENTIDADES de um banco de dados relacional, devemos identificar as


ANOMALIAS NELAS EXISTENTES.

Professor: Alberson Wander Página: 2


Banco de Dados UNIVAP - CTI

5.1 – ANOMALIAS DE ENTIDADES DE BANCO DE DADOS

As anomalias mais comuns existentes em ENTIDADES de um banco de dados são as seguintes:


• Anomalia da INCLUSÃO;
• Anomalia da INCONSISTÊNCIA;
• Anomalia da ALTERAÇÃO (atualização);
• Anomalia da EXCLUSÃO;

Vamos ilustrar as situações de anomalias de entidades. Com isso será possível sabermos quando
devemos normalizar a ENTIDADE. Observe a entidade abaixo:
Pedidos_Pecas
Num_pedido Data Num_peça Descricao Quantidade Preco
1000 14/11/98 Ax12 Bicicleta 3 90,00
1020 15/11/98 BT04 Tv 10 400,00
1030 15/11/98 BZ66 Bola 300 5,00
1040 16/11/98 BT04 Tv 4 160,00
1050 17/11/98 CB03 Vidro 5 25,00
1070 20/11/98 BT04 Bola 2 80

5.1.1 – Anomalia de INCLUSÃO

Repare na entidade Pedidos_pecas, mostrada no capítulo 5.1 desta apostila, que para trabalhar com
uma nova peça no banco de dados, o usuário será obrigado fazer um pedido da mesma, visto que não é
possível somente cadastrar dados da peça. Este é um exemplo prático de uma anomalia de INCLUSÃO.

5.1.2 – Anomalia de ALTERAÇÃO (atualização)

Repare na entidade Pedidos_pecas, mostrada no capítulo 5.1 desta apostila, que ao efetuar UMA
alteração na peça BT04, essa se fará necessária em várias outras tuplas da entidade, visto que vários pedidos
desta mesma peça foram cadastrados na entidade. Este é um exemplo prático de uma anomalia de
ALTERAÇÃO.

5.1.3 – Anomalia de EXCLUSÃO

Repare na entidade Pedidos_pecas, mostrada no capítulo 5.1 desta apostila, que ao excluirmos o
pedido 1000 perderemos também qualquer referência da peça AX12, pois esta foi requisitada somente em um
pedido. Imagine o que aconteceria se esta peça fosse vendida para algum cliente! Este é um exemplo prático
de uma anomalia de EXCLUSÃO.

5.1.4 – Anomalia de INCONSISTÊNCIA

Repare na entidade Pedidos_pecas, mostrada no capítulo 5.1 desta apostila, que não há nada que
impeça que a peça BT04 seja cadastrada com várias descrições diferentes. Isso seria uma catástrofe no
momento de uma venda! Este é um exemplo prático de uma anomalia de INCONSISTÊNCIA.

Diante das anomalias exemplificadas anteriormente iremos falar neste ponto das normalizações de
entidades de um banco de dados. Existem 6 formas de normalizarmos uma entidade, segundo CODD, a saber:
• 1NF  primeira forma normal;
• 2NF  segunda forma normal;
• 3NF  terceira forma normal;
• BCNF  Forma normal de Boyce Codd;
• 4NF  quarta forma normal;
• 5NF  quinta forma normal;

Professor: Alberson Wander Página: 3


Banco de Dados UNIVAP - CTI

5.2 – 1NF (PRIMEIRA FORMA NORMAL)

Uma relação está na 1FN, se somente todos os domínios básicos (CONTEÚDOS DE CADA CAMPO)
contiverem somente valores atômicos (não repetidos). Para atingir esta forma normal devemos eliminar os
grupos de registros repetidos. Como?

Procedimentos:
a) Identificar a chave primária da entidade;
b) Identificar o grupo de atributos que causam a repetição de registros e excluí-lo da entidade;
c) Criar uma nova entidade com a chave primária da entidade anterior e o grupo de atributos que causavam a
repetição.

A chave primária da nova entidade será obtida pela concatenação da chave primária da entidade
inicial e a chave primária do grupo repetitivo.

Figura 1

A ENTIDADE ACIMA NÃO ESTÁ NORMALIZADA, PORTANTO DEVEMOS NORMALIZÁ-LA PARA A 1NF,
pois apresenta as seguintes ANOMALIAS:

a) Para toda nota fiscal cadastrada, há necessidade de informarmos o código, a descrição e o


preco de venda de CADA mercadoria da nota. Desta forma, corremos o risco de
cadastrarmos uma descrição ou preço, de uma MESMA MERCADORIA, de diferentes
formas.
b) Caso seja necessário alterar a descrição ou preço de venda de uma mercadoria,
correríamos o risco de alterar somente em uma tupla da entidade.
c) Se quisermos excluir uma determinada mercadoria da entidade, deveremos procurá-la
tupla a tupla, o que tornaria uma tarefa trabalhosa.
d) Caso excluíssemos da entidade uma mercadoria que fosse cadastrada uma única vez,
perderemos as informações dessas para consultas futuras.

Para solução das anomalias acima, deveremos normalizar a tabela notafiscal para a 1NF, conforme
figura abaixo:

Figura 2

Professor: Alberson Wander Página: 4


Banco de Dados UNIVAP - CTI

OBSERVAÇÃO IMPORTANTE: Na nova entidade “Vendas”, ilustrada na figura anterior, note que a
chave primária é composta pela chave da tabela NotaFiscal (NumeroNotaFiscal) e CódigoMercadoria.

5.3- 2NF (SEGUNDA FORMA NORMAL)

Uma relação está na 2FN, se e somente se, ela estiver na 1NF e todos os atributos não chave forem
totalmente dependentes da chave primária (dependente de toda a chave e não apenas de parte dela).

Procedimentos:
a) Identificar os atributos que não são funcionalmente dependentes de toda a chave primária.
b) Remover da entidade todos esses atributos identificados e criar uma nova entidade com eles.

A chave primária da nova entidade será o atributo nos quais os atributos removidos são funcionalmente
dependentes.
Exemplo: Vejamos as entidades a seguir:
Notas Fiscais:
(Num. NF, Série, Código do Cliente, Nome do cliente, Endereço do cliente, Total Geral da Nota)
Arquivo de Vendas:
(Num. NF, Código da Mercadoria, Descrição da Mercadoria, Quantidade vendida, Preço de venda e Total da
Venda)

Figura 3

AS ENTIDADES ACIMA NÃO ESTÃO NA SEGUNDA FORMA NORMAL,


MAS SIM NA PRIMEIRA FORMA NORMAL

Normalizando para segunda forma normal (2FN):


Arquivo de Notas Fiscais (Num. NF, Série, Código do Cliente, Nome do cliente, Endereço do cliente, Total
Geral da Nota)
Arquivo de Vendas (Num. NF, Código da Mercadoria, Quantidade vendida e Total da Venda)
Arquivo de Mercadorias (Código da Mercadoria, Descrição da Mercadoria, Preço de venda)

Figura 4
Como resultado desta etapa, houve um desdobramento do arquivo de Vendas (a ENTIDADE
NOTAFISCAL, não foi alterada, por não possuir chave composta) em duas estruturas, a saber:

Professor: Alberson Wander Página: 5


Banco de Dados UNIVAP - CTI

Primeira estrutura (Arquivo de Vendas): Contêm os atributos originais, sendo excluídos os dados que
são dependentes apenas do campo Código da Mercadoria.
Segundo estrutura (Arquivo de Mercadorias): Contém os elementos que são identificados apenas
pelo Código da Mercadoria, ou seja, independentemente da Nota Fiscal, a descrição e o preço de venda serão
constantes.

5.4- 3FN (Terceira Forma Normal)

Uma relação está na 3FN se somente estiver na 2FN e todos os atributos não chave forem
dependentes não transitivos da chave primária (cada atributo for funcionalmente dependente apenas dos
atributos componentes da chave primária, ou se, todos os seus atributos não chave forem independentes entre
si).

Procedimentos:
a) Identificar todos os atributos que são funcionalmente dependentes de outros atributos não chave;
b) Removê-los e criar uma nova entidade com os mesmos.

A chave primária da nova entidade será o atributo nos quais os atributos removidos são funcionalmente
dependentes.
Estrutura na segunda forma normal (2FN): Observem as entidades abaixo:
Notas Fiscais:
(Num. NF, Série, Data emissão, Código do Cliente, Nome do cliente, Endereço do cliente, Total Geral da Nota)
Vendas:
(Num. NF, Código da Mercadoria, Quantidade vendida e Total da venda desta mercadoria)
Mercadorias:
(Código da Mercadoria, Descrição da Mercadoria, Preço de venda)

Estrutura na terceira forma normal (3FN): Observem as entidades abaixo:


Notas Fiscais:
(Num. NF, Série, Data emissão, Código do Cliente e Total Geral da Nota)
Vendas:
(Num. NF, Código da Mercadoria, Quantidade vendida e Total da venda desta mercadoria)
Mercadorias:
(Código da Mercadoria, Descrição da Mercadoria, Preço de venda)
Clientes:
(Código do Cliente, Nome do cliente, Endereço do cliente)

Como resultado desta etapa, houve um desdobramento do arquivo de Notas Fiscais, por ser o único que
possuía campos que não eram dependentes da chave principal (Num. NF), uma vez que independente da Nota
Fiscal, o Nome, Endereço são inalterados. Este procedimento permite evitar inconsistência nos dados dos
arquivos e economizar espaço, por eliminar o armazenamento freqüente e repetidas vezes destes dados. A
cada nota fiscal comprada pelo cliente, haverá o armazenamento destes dados e poderá ocorrer divergência
entre eles.

As estruturas alteradas e o motivo das alterações:


- Primeira estrutura (Notas Fiscais): Contêm os elementos originais, sendo excluído os dados que são
dependentes apenas do campo Código do Cliente (informações referentes ao cliente).
- Segundo estrutura (Clientes): Contém os elementos que são identificados apenas pelo Código do Cliente, ou
seja, independente da Nota Fiscal, o Nome, Endereço serão constantes.

Após a normalização, as estruturas dos dados estão projetadas para eliminar as inconsistências e
redundâncias dos dados, eliminando desta forma qualquer problema de atualização e operacionalização do

Professor: Alberson Wander Página: 6


Banco de Dados UNIVAP - CTI

sistema. A versão final dos dados poderá sofrer alguma alteração, para atender as necessidades específicas
do sistema, a critério do analista, durante a fase de desenvolvimento do projeto físico do sistema.

5.5- BCNF ou NFBC (Forma Normal de BOYCE CODD) / 4FN (Quarta Forma Normal) e 5FN(Quinta Forma
Normal)

A BCNF, a 4FN e a 5FN não serão abordadas neste curso. Ressalta-se que estas normalizações
existem e devem ser tratadas em cursos que abordam a fundo as teorias de banco de dados. Vale dizer
também, que o objetivo desse curso é aprofundarmos na linguagem Transact-SQL e conhecer a ferramenta
SQL-SERVER, o que faz necessário termos noções básicas de normalizações e relacionamentos entre
entidades de um banco de dados relacional.
Antes de normalizarmos as tabelas de um banco de dados devemos passar por etapas de modelagem
de dados. As etapas envolvidas na construção de modelos de dados são:
• Modelo Conceitual
• Modelo Lógico
• Modelo Físico

– MODELO CONCEITUAL
Nesta etapa da modelagem de dados o DBA deve:
• Conhecer o negócio
• Rascunhar as principais entidades do BD. e seus principais atributos.
• Não se preocupar com os relacionamentos n : n.

– MODELO LÓGICO
Nesta etapa da modelagem de dados o DBA deve:
• Representar o negócio.
• Criar as entidades de relacionamentos para substituir os relacionamentos n:n.
• Definir as chaves primárias de cada entidade.
• Normalizar as tabelas.
• Adequar aos padrões do banco de dados escolhido, neste caso, ao padrão do SQL
SERVER.
• Documentar as entidades e seus atributos.

– MODELO FÍSICO
Nesta etapa da modelagem de dados o DBA deve:
• Tomar ciência das limitações do banco de dados, neste caso, o SQL-SERVER.
• Considerar os requisitos dos softwares que farão acesso ao banco de dados.
• Criar fisicamente as entidades, relacionamentos, chaves, índices, definir níveis de
acessos entre outros, ou seja, criar fisicamente o banco de dados projetado nas etapas
anteriores.

6 – SQL-SERVER

De agora para frente iremos abordar assuntos relativos à ferramenta SQL-SERVER 2005 Express
Edition.

Comparando o SQL-SERVER com o ACCESS, podemos destacar principalmente entre as diferenças,


a capacidade de armazenamento, visto que o ACCESS manipula no MÁXIMO 2GB de registros distribuídos
entre as entidade de um banco de dados. Já o SQL-SERVER é capaz de manipular registros desde que haja
espaço no HD. Porém, esta versão que estamos usando, 2005 EXPRESS EDITION, permite manipularmos em
cada arquivo de banco de dados no máximo de 4 GB.

Outra grande vantagem do SQL-SERVER refere-se ao fato do mesmo trabalhar com arquitetura
cliente-servidor. Com isso, todos os bancos de dados criados no SQL poderão ser acessados pelo cliente, no
servidor.

Um Servidor SQL pode conter vários bancos de dados, que por sua vez são acessados por vários
usuários.

Professor: Alberson Wander Página: 7


Banco de Dados UNIVAP - CTI

Num banco de dados criado no SQL-SERVER, poderemos limitar os acessos ao próprio banco, como
também às entidades e até mesmo seus atributos. Tarefas como leitura, gravação, exclusão e consulta à tuplas
também podem ser limitadas para determinados usuários.

6.1 – COMPONENTES DO SQL-SERVER 2005 Express Edition

Os principais componentes do SQL-SERVER são os seguintes:


• Banco de dados
• Tabelas
• Diagrams
• Visões
• Stored Procedures
• Triggers
• Etc..
A seguir veremos com mais detalhes cada componente de um banco de dados do SQL.

6.1.1 – BANCO DE DADOS

Um banco de dados é composto por:


• Tabelas;
• Visões;
• Triggers;
• Stored Procedures;
• E outros;

Como dito anteriormente o SQL Server 2005 Express Edition pode manter vários bancos de dados.

Cada novo banco de dados criado possuirá os componentes citados acima. A figura abaixo ilustra os
componentes dos bancos de dados criados no servidor SQL:

Figura 5

Repare que o banco de dados MASTER possui seus componentes: Tables, Views, Stored Procedures
e etc. Perceba que no banco de dados NORTWIND, estes mesmos componentes estão presentes.

Professor: Alberson Wander Página: 8


Banco de Dados UNIVAP - CTI

6.1.2 – TABELAS (ENTIDADES)

Este componente é responsável por criar e manipular as tabelas do banco de dados. Lembre-se que
cada entidade armazena tuplas de registros. Cada entidade é composta por atributos (campos). Cada conjunto
de registros, armazenados em cada atributo, recebe o nome de domínio.

Quando criados, os atributos podem conter restrições quanto ao conteúdo a ser armazenado, são as
consistências de dados ou constraints.
No momento da criação das tabelas poderemos definir o(s) campo(s) que compõe(m) a(s) chave(s)
primária(s).

6.1.3 – DIAGRAMAS DE BANCO DE DADOS

Com este componente, torna-se possível principalmente a criação dos relacionamentos entre tabelas
do banco de dados.

Figura 6

6.1.4 – STORED PROCEDURES

As stored procedures exercem um papel fundamental num banco de dados. São usadas como
procedimentos, que podem ou não receber parâmetros de entrada. Estas procedures são mantidas no
provedor e quando solicitadas por uma aplicação ou usuário, são postas em execução. Dentro destas
procedures são usados comandos da linguagem Transact-SQL.

6.1.5 – VISÕES

Uma visão é o resultado de uma consulta SQL, gerada por instrução SELECT da linguagem Transact-
SQL.
As visões não são tabelas físicas. Estas são atualizadas sempre que as visões são colocadas em
execução. Portanto, quando criamos e gravamos uma visão, sempre serão atualizadas, de acordo com os
dados armazenados nas tabelas do banco de dados em questão.

Professor: Alberson Wander Página: 9


Banco de Dados UNIVAP - CTI

6.1.6 – TRIGGERS

Uma trigger nada mais é do que uma rotina de programação que é disparada (executada)
automaticamente, diante de um cadastro, alteração e/ou exclusão de registros em uma tabela.

Quando criamos a trigger informamos em que momento ela será disparada.

Nas triggers são utilizados comandos da linguagem Transact-SQL.

7 – O AMBIENTE DO SQL-SERVER 2005 EXPRESS EDITION

Para acessarmos o SQL-Server 2005 Express Edition, devemos acessá-lo no grupo de programas do
SQL, conforme mostrado abaixo:

Figura 7

Ao clicar na opção “SQL Server Management Studio Express”, surgirá então a seguinte tela:

Professor: Alberson Wander Página: 10


Banco de Dados UNIVAP - CTI

Figura 8

Na tela acima, na janela “Connect to Server”, não se esqueça de informar o conteúdo para o campo
“Server name”, pois esta informação refere-se ao nome do servidor SQL instalado no seu computador.
Inclusive o nome que aparece no exemplo acima, com certeza será diferente no seu computador.
Por fim, para efetuar a conexão com o servidor SQL, clique no botão “Connect”. Surgirá então as
seguintes áreas do ambiente do SQL-SERVER:

Figura 9

Professor: Alberson Wander Página: 11


Banco de Dados UNIVAP - CTI

7.1 – ASSISTENTE DE CRIAÇÃO DE BANCO DE DADOS NO SQL-SERVER

Figura 10

Para criação de um novo banco de dados basta:


• Clicarmos com botão direito do mouse sobre “Databases”
• No menu que surgir (mostrado na figura acima) clique na opção “New Database”
• Na tela que surgir, indique o nome do banco de dados que será criado. Digite o nome do banco
no campo “Database Name”, conforme ilustra a figura abaixo:

Figura 11

• O arquivo do banco de dados será gravado na pasta do servidor SQL-SERVER, localizada


em “C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data”.

Professor: Alberson Wander Página: 12


Banco de Dados UNIVAP - CTI

• Para concluir a criação física do arquivo de banco de dados, basta clicar no botão “OK”.

Após seguir os passos descritos anteriormente, seu banco de dados será mostrado como nos
exemplos abaixo, indicados pelas setas:

Figura 12

7.2 – ATTACH DATABASE

Este recurso é utilizado para acessarmos um banco de dados no SQL-SERVER.

Quando houver necessidade de copiarmos um banco de dados para outro servidor SQL, devemos
“atachá-lo” neste servidor. Os arquivos de log (.ldf), e do banco de dados (.mdf) devem ser copiados para o
computador, NA PASTA “C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data”, onde se encontra o
servidor SQL.

Em seguida, na janela “Object Explorer” siga os passos abaixo:


• Clique com o botão direito do mouse sobre o componente “Databases”;
• Escolha a opção “Attach...”;

A figura abaixo ilustra os passos acima:

Figura 13

Professor: Alberson Wander Página: 13


Banco de Dados UNIVAP - CTI

Surgirá então a seguinte janela:

Figura 14

Siga os passos abaixo, a partir da janela mostrada acima, para “atachar” (puxar/fixar/carregar) o banco
de dados copiado anteriormente para a pasta do servidor SQL.

• Na janela acima, dê um clique no botão “Add...”.


• Surgirá a janela “Locate Database Files”, mostrada abaixo:

Figura 15

Professor: Alberson Wander Página: 14


Banco de Dados UNIVAP - CTI

Obs.: Repare que a janela da mostrada, mostra todos os bancos de dados (arquivos .mdf), existentes
na pasta do servidor.

• Basta, então, selecionar o nome do banco de dados desejado e clicar no botão “OK”. Desta
forma o banco de dados aparecerá na janela “Object Explorer”.

7.3 – CRIAÇÃO DE TABELAS NO BANCO DE DADOS

Para criação de tabelas em um banco de dados é necessário abri-lo primeiramente. Faça isso clicando
no nome do banco de dados, mostrado na janela “Object Explorer”, conforme exemplo abaixo:

Para criar uma nova tabela em um banco de dados, siga os passos a seguir:
• clique com o botão direito do mouse no objeto “Table”;
• Surgirá um submenu, neste selecione a opção “New Table...”, conforme figura abaixo:

Figura 16

• Surgirá então as seguintes áreas, apontadas pelas setas:

Figura 17

Professor: Alberson Wander Página: 15


Banco de Dados UNIVAP - CTI

A área mostrada é usada para criar uma nova tabela. Nela indique:

Column Name: Nesta coluna você deve indicar os nomes dos atributos da entidade (Campos da
tabela) que serão criados.

Data Type: Indique o tipo de dado de cada atributo criado.

Allow Nulls: Quando esta coluna apresentar uma marca de checagem indicará que o
atributo em questão aceitará gravação registros sem que o usuário tenha informado um dado qualquer para o
referido campo.
Para criar fisicamente a tabela, basta clicar no botão e indicar o nome da tabela na janela que
surgirá.

Após criar a tabela, quando necessário, será possível alterá-la. Para isto, basta clicar com o botão
direito do mouse sobre o nome da tabela, estando com a árvore de objetos “Table” aberta, no banco de dados
onde a mesma se encontra, conforme a figura abaixo:

Figura 18

Ao clicar na opção “Design” no submenu mostrado, a área estrutura da tabela será novamente
mostrada, para que se possa incluir, alterar ou excluir campos.

7.4 – CRIAÇÃO DE CHAVE PRIMÁRIA PARA TABELAS

Para criação de chaves primárias siga os passos abaixo:


• Selecione o(s) atributos (s) que irão compor a chave primária;

• Clique no botão , mostrado na figura a seguir.

Veja o exemplo abaixo:

Figura 19

Professor: Alberson Wander Página: 16


Banco de Dados UNIVAP - CTI

Na figura, foram selecionados para chave primária os atributos: “codigo" e “cpf”. Em seguida, foi clicado
no botão da chave, disposto na barra de ferramentas. Esses processos fizeram dos atributos indicados, chave
primária COMPOSTA da tabela.

Para exemplificar, vamos excluir alguns atributos da entidade “professores”. Veja como ficará o layout
da tabela:

Figura 20

Para excluir um atributo da tabela selecione-o e pressione o botão “Delete”.

7.5 – RELACIONANDO TABELAS(ENTIDADES)

O relacionamento entre tabelas normalizadas é outra importante operação disponível nos SGBD’s. No
SQL-SERVER, utilizaremos inicialmente o objeto “DIAGRAMS” para relacionar as tabelas do banco de dados.

Antes, porém, é importante citarmos os tipos de relacionamentos existentes entre tabelas de um banco
de dados, a saber:

1. 1..N: Um único registro da tabela PAI pode se relacionar com vários registros na tabela filho;
2. 1..1: Um único registro da tabela PAI pode se relacionar com um único registro na tabela filho;
3. N..N: Vários registros da tabela PAI poderão se relacionar com vários registros na tabela filho.
É importante ressaltar que este tipo de relacionamento não deve existir num banco de dados.
Para isso, devemos criar uma tabela de entidade de relacionamento, que fará com que a
relação se torne 1..n. Veremos a solução prática para este exemplo mais a frente;

IMPORTANTE:

1. PARA RELACIONAR DUAS OU MAIS TABELAS, NÃO DEVEM EXISTIR REGISTROS CADASTRADOS
NAS MESMAS.

2. Os campos envolvidos no relacionamento (chave(s) primária(s) e chave(s) estrangeira(s) devem ser


do MESMO TIPO E TAMANHO). OS NOMES DE TAIS CHAVES NÃO PRECISAM SER O MESMO.

7.5.1 – RELACIONAMENTO 1..N

Conforme descrito anteriormente, este tipo de relacionamento faz com que 1 registro da tabela Pai se
relacione com vários outros na tabela FILHO. Vejamos o exemplo na figura a seguir:

Professor: Alberson Wander Página: 17


Banco de Dados UNIVAP - CTI

Figura 21

Reparem na figura que foram criadas as tabelas “professores” e “telefonesprofessor”.

Analise as seguintes observações:


1. Na tabela “professores”, verifique que o campo “codigoprofessor” é chave primária. Isso fará com
que exista somente UM professor com um código específico.
2. Na tabela “telefonesprofessor”, veja que existe uma chave primária COMPOSTA pelos campos
“codprofessor” (também conhecida como chave estrangeira) e “telefoneprofessor”. Isso possibilitará
o cadastro de vários telefones para um professor. Por exemplo:

Figura 22

3. Se relacionamos as duas tabelas, veremos que o tipo de relacionamento será 1..N, conforme
mostrado na figura abaixo:

1
N
Figura 23

4. Na tabela FILHO, SE O CAMPO “CodProfessor” não fizesse parte da chave primária, o tipo de
relacionamento ainda sim seria 1..N. Conforme ilustra a figura abaixo:

Figura 24

7.5.2 – RELACIONAMENTO 1..1

Neste tipo de relacionamento teremos o campo chave primária da tabela PAI sendo também sendo o
campo chave da tabela FILHO, ou seja, o mesmo campo chave primária nas tabelas envolvidas no

Professor: Alberson Wander Página: 18


Banco de Dados UNIVAP - CTI

relacionamento. Por esse motivo temos um único registro cadastrado somente uma vez em ambas as tabelas,
o que torna o relacionamento 1..1. Veja o exemplo mostrado na figura abaixo:

1 1

Figura 25

Analise a seguintes observação:


• A figura acima mostra que para cada professor cadastrado na tabela “professores”, poderemos
ter SOMENTE UM telefone cadastrado na tabela “telefoneprofessor”, ISTO PORQUE somente
o campo “codprofessor” é chave primária e estrangeira nesta tabela.

7.5.3 – RELACIONAMENTO N..N

Este tipo de relacionamento não deve aparecer em banco de dados. Eles são “excluídos” devido à
necessidade de criação de uma tabela chamada “entidade de relacionamento”.

Uma entidade de relacionamento deve conter os campos chaves das tabelas que possuem o tipo de
relacionamento N..N. Com isso, relacionam-se as tabelas PAI e FILHO com esta entidade de relacionamento.

Veja a figura abaixo, ela representa a situação descrita acima:

Figura 26

Professor: Alberson Wander Página: 19


Banco de Dados UNIVAP - CTI

Se relacionarmos as tabelas criadas teremos:

1 N
N 1

Figura 27

Analisemos o relacionamento acima:


1. Com o relacionamento acima, tornamos possível que um professor tenha vários telefones e que um
mesmo telefone pertença a mais de um professor. Um exemplo típico para esta situação é a de
professores casados que tenham os mesmos telefones de contato.
2. A tabela “TelefonesProfessores” foi criada para solucionarmos o tipo de relacionamento N..N.
Portanto esta tabela é chamada de “entidade de relacionamento” entre as tabelas “professores” e
“telefones”.

7.5.4 – CRIAÇÃO DE RELACIONAMENTOS PELO OBJETO DATABASE DIAGRAMS

Como visto anteriormente, o objeto “DATABASE DIAGRAMS” é utilizado para criarmos os


relacionamentos entre tabelas de um banco de dados.

Utilize os passos abaixo para relacionar as tabelas de um banco de dados:


1. Clique com o botão direito do mouse sobre o objeto “Database Diagrams”, disposto na árvore
de objetos do banco de dados em aberto;
2. No menu que irá surgir, clique sobre “New Database Diagram”, conforme ilustra a figura a
seguir:

Figura 28

Após seguir os passos acima, veremos a janela do assistente de criação de relacionamentos, chamada
“Add Table”, conforme ilustra a próxima figura:

Professor: Alberson Wander Página: 20


Banco de Dados UNIVAP - CTI

Figura 29

Usando a janela “Add Table” clique no botão “Add” para incluir as tabelas que serão relacionadas,
neste exemplo serão relacionadas todas as tabelas. Após adicionar todas as tabelas que serão relacionadas
entre si, basta clicar no botão “Close”, para fechar a janela “Add Table”. Veja o resultado na figura abaixo:

Figura 30

Professor: Alberson Wander Página: 21


Banco de Dados UNIVAP - CTI

Se você notar que se esqueceu de relacionar uma tabela qualquer na área acima, clique com o botão
direito do mouse sobre a área onde as tabelas estão sendo mostradas, e em seguida clique na opção “Add
Table...”. Com isso você poderá inserir outras tabelas na área de diagramas acima.

Para relacionarmos as tabelas mostradas na área de diagramas, devemos arrastar O(S) CAMPO(S)
DA CHAVE PRIMÁRIA, DA TABELA PAI, para cima do(s) CAMPO(S) CHAVE ESTRANGEIRA na tabela
FILHO. Quando este processo for feito, surgirá a tela “Tables and Columns”, para definições gerais do
relacionamento que será criado:

Figura 31

Na janela acima, temos:

Primary Key Table: Indica o nome da tabela PAI onde está a chave primária;
Foreign Key Table: Indica o nome da tabela FILHO onde se encontra a chave estrangeira;

: Indicam quais os campos serão relacionados.


Caso algum campo não esteja relacionado, basta clicar na linha e seleciona-lo na caixa que será aberta.

Ao termino da indicação dos campos que serão relacionados, clique no botão “OK”. A janela será
fechada e a seguinte janela será mostrada:

Professor: Alberson Wander Página: 22


Banco de Dados UNIVAP - CTI

Figura 32

Na janela acima observe as seguintes opções:

Figura 33

Delete Rule: Com a opção “Cascade” selecionada, as exclusões de registros na tabela “PAI” excluirão
automaticamente registros relacionados na tabela “FILHO”.

Update Rule: Com a opção “Cascade” selecionada, as alterações em registros na tabela “PAI” alterarão
automaticamente registros relacionados na tabela “FILHO”.

O botão “OK”: este botão criará o relacionamento físico entre as tabelas PAI e FILHO. O tipo do
relacionamento será indicado AUTOMATICAMENTE, diante das definições de chave primária e estrangeiras,
nas tabelas PAI e FILHO.

Após o término das definições dos relacionamentos, criamos um relacionamento físico entre as tabelas,
conforme ilustra a próxima figura:

Professor: Alberson Wander Página: 23


Banco de Dados UNIVAP - CTI

Figura 34

IMPORTANTE:

Tabela PAI: Refere-se à tabela que ENVIA dados para outra tabela da relação;

Tabela FILHO: Refere-se à tabela que RECEBE dados da tabela pai da relação;

Vale dizer que TODOS os relacionamentos devem ser criados, antes de gravá-los. No exemplo acima
criamos somente a relação entre as tabelas “professores” e “telefoneprofessor”. Poderíamos relacionar também
a tabela “univap” com a tabela “telefoneprofessor”.

Para gravar os relacionamentos criados, basta clicar no botão , disponível na barra de ferramentas
do SQL-SERVER. Dê o nome que desejar para os relacionamentos criados.

8 – MANIPULANDO TUPLAS EM UMA ENTIDADE

Depois de criados os relacionamentos entre as tabelas do banco de dados, você poderá gravar e
manipular registros nessas.

LEMBRETE: NÃO GRAVE REGISTROS NAS TABELAS ANTES DE RELACIONÁ-LAS. Se as


tabelas possuírem registros, você não conseguirá criar os relacionamentos, pois o SGBD irá verificar se
existem registros que farão com que se perca a integridade de dados, ou seja, por exemplo: a tabela FILHO
possua registros não cadastrados anteriormente na tabela PAI.

Para cadastrar registros É NECESSÁRIO FAZÊ-LO PRIMEIRAMENTE NA TABELA PAI.

Baseado nas últimas tabelas, mostradas anteriormente nesta apostila, vamos cadastrar registros na
tabela “professores”, para isso siga os passos a seguir:
• Clique no objeto “Tables”, na árvore de objetos do SQL-SERVER, para que o SQL mostre
a árvore com nomes de todas as tabelas existentes no banco de dados desejado;
• Clique com o botão direito do mouse sobre o nome da tabela desejada;
• No submenu, clique sobre “Open Table...”, conforme ilustrado na figura abaixo:

Figura 35

Professor: Alberson Wander Página: 24


Banco de Dados UNIVAP - CTI

Seguidos os passos acima, surgirá a seguinte tela de edição de registros do SQL-SERVER:

Figura 36

Para CADASTRAR um registro, basta começar a digitar o “codigoprofessor” , o “nomeprofessor” e


“idadeprofessor”. Após a digitação da idade do professor, basta pressionar <enter>, para o registro ser gravado
na tabela.

Para ALTERAR um registro, basta clicar no campo do registro desejado e redigitar o dado. O simples
fato de passar para um próximo registro, fará com que a alteração seja concretizada.

Para EXCLUIR um registro, basta clicar na seta que aponta para o registro corrente e
pressionar a tecla “Delete”, no teclado do computador. Este processo irá excluir o registro da tabela.

9 – TESTES DE INTEGRIDADE DE DADOS

Os testes de integridade de dados podem ser feitos em vários momentos, a saber:


• Na INCLUSÃO de registros nas tabelas FILHO;
• Na EXCLUSÃO e ALTERAÇÃO de registros nas tabelas PAIS.

Vamos esclarecer melhor os testes citados acima. Vamos observar os seguintes relacionamentos entre
as tabelas :

Figura 37

Agora vamos explicar na prática os testes de integridade, diante dos relacionamentos mostrados na
figura acima:

Professor: Alberson Wander Página: 25


Banco de Dados UNIVAP - CTI

INCLUSÃO: Na tabela “TelefonesProfessores” só será permito o cadastro de novos registros se, e


somente se, existirem professores e telefones cadastrados nas tabelas “professores” e “telefone”,
respectivamente.

EXCLUSÃO ou ALTERAÇÃO: Se no momento da criação dos relacionamentos acima, o DBA NÃO


OPTOU por EXCLUSÃO e/ou ALTERAÇÃO EM CASCATA, e tentarmos excluir, ou alterar registros de
“professores” e/ou “telefones” que estão diretamente ligados a registros na tabela “TelefonesProfessores”, o
SQL-SERVER exibirá uma mensagem de alerta, indicando que a operação escolhida não será concretizada,
isso para não ocorrer falha na integridade de dados. Na prática, imagine se conseguíssemos excluirmos um
professor cujo código, por exemplo, fosse 100, da tabela “professores” e existissem telefones do mesmo,
cadastrados na entidade de relacionamento “TelefonesProfessores”. Diante deste exemplo prático, não
saberíamos dizer qual o nome e/ou idade do professor que possui os telefones existentes na entidade de
relacionamento “TelefoneProfessores”, pois o excluímos da tabela PAI (“professores”). O mesmo controle vale
para a operação de Alteração.

10 – VISÕES

Como dito anteriormente, cada banco de dados possui o objeto “VIEWS”. Esse objeto deve ser usado
para criarmos consultas a registros de uma tabela, utilizando a instrução “SELECT” da Transact-SQL.

O objeto VIEWS de um banco de dados, cria uma tabela TEMPORÁRIA, cujos registros armazenados
serão filtrados de tabela(s) do banco em uso.

No SQL-SERVER, poderemos usar o assistente de criações de visão. Para isso, devemos abrir o
banco de dados desejado. Em seguida, siga os passos ilustrados a seguir:

Figura 38

Surgirá então a seguinte tela:

Professor: Alberson Wander Página: 26


Banco de Dados UNIVAP - CTI

Figura 39

Onde:

- Usado para gravar as INSTRUÇÕES que geraram uma consulta;

- Estes botões farão fechar ou mostrar, os painéis da área de trabalho mostrado na


figura;

- Executa uma consulta criada;

- Analisa uma consulta SQL criada.

- Faz uso da cláusula Group...By (será abordada posteriormente), na consulta SQL criada;

- Este botão é o mais importante da janela acima, pois ele permitirá escolhermos quais tabelas
físicas serão usadas para criação das consultas de registros.

Para ilustrar uma consulta criada pelo objeto VIEWS, vamos indicar uma tabela qualquer de um banco
de dados, por exemplo a tabela “professores”. Para isso, basta selecionarmos o nome da tabela na janela “Add
Table” e clicar no botão “Add”, conforme a figura a seguir:

Professor: Alberson Wander Página: 27


Banco de Dados UNIVAP - CTI

Figura 40

Quando clicarmos no botão , a janela “Add Table” surgirá novamente, se estiver fechada. Então,
selecione o nome da tabela desejada e clique novamente no botão “Add”.

No exemplo acima, foi escolhida a tabela “professores”. Quando o botão “Add” foi clicado, a tabela foi
inserida na área de criação da visão, disposta atrás da “Add Table”. Caso necessário, você poderá utilizar,
numa só consulta, várias tabelas. Veremos mais adiante a utilidade de usarmos numa consulta várias tabelas.

Depois de inserida a tabela escolhida para consultas, podemos fechar a janela “Add Table” e
definirmos, por exemplo, quais os campos serão mostrados na consulta sql, bem como quais serão os critérios
de filtro de registros na tabela. Veja o exemplo a seguir:

Figura 41

No exemplo acima, indicamos na coluna “COLUMN”, quais os dados deveriam ser mostrados de cada
professor gravado, no caso: codigoprofessor e nomeprofessor. Isto pode ser feito clicando na caixa localizada
ao lado do nome do campo, na tabela exibida ( ).

Professor: Alberson Wander Página: 28


Banco de Dados UNIVAP - CTI

Você deve ter reparado também, que após indicar cada campo na coluna “Column”, uma instrução
“Select” ia sendo criada automaticamente pelo SGBD.

Para executarmos o comando “SELECT codigoprofessor, nomeprofessor FROM dbo.professores”,


basta clicar no botão . Desta forma, foram mostrados todos os códigos e nomes de professores gravados
na tabela professores. O resultado pode ser visualizado numa tabela, disposta após a linha de código gerada
pelo assistente de “visão”.

11 – CRIANDO E EXECUTANDO QUERY COM O BOTÃO “New Query”

Podemos criar banco de dados, tabelas e manusear registros utilizando linhas de comandos da
linguagem Transact-SQL. Tudo que foi mostrado até este ponto, nesta apostila, podemos fazer por meio de
comandos.

Vale dizer que no SQL-SERVER, assim como a maioria dos SGBD’s existentes, a linguagem usada
para criar banco de dados e tabelas, bem como manusear registros nessas estruturas é a SQL (Structured
Query Language).

Os comandos da SQL são divididos em cinco grupos, a saber:

1º) DML - Linguagem de Manipulação de Dados


Primeiro há os elementos da DML (Data Manipulation Language - Linguagem de Manipulação
de Dados). A DML é um subconjunto da linguagem usada para inserir, atualizar e apagar dados.
• INSERT é usada para inserir um registro (formalmente uma tupla) a 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.

2º) DDL - Linguagem de Definição de Dados


O segundo grupo é a DDL (Data Definition Language - Linguagem de Definição de Dados).
Uma DDL permite ao utilizador 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

3º) DCL - Linguagem de Controle de Dados


O terceiro grupo é o DCL (Data Control Language - Linguagem de Controle de Dados). DCL
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.

Professor: Alberson Wander Página: 29


Banco de Dados UNIVAP - CTI

Outros comandos DCL:


• ALTER PASSWORD
• CREATE SYNONYM

4º) DTL - Linguagem de Transação de Dados


• BEGIN WORK (ou START TRANSACTION, dependendo do dialeto SQL) pode ser usado
para marcar o começo de uma transação de banco de dados que pode ser completada ou
não.
• COMMIT envia todos os dados das mudanças permanentemente.
• ROLLBACK faz com que as mudanças nos dados existentes desde que o último COMMIT
ou ROLLBACK sejam descartadas.

COMMIT e ROLLBACK interagem com áreas de controle como transação e locação. Ambos
terminam qualquer transação aberta e liberam qualquer cadeado ligado a dados. Na ausência de um
BEGIN WORK ou uma declaração semelhante, a semântica de SQL é dependente da implementação.

5º) DQL - Linguagem de Consulta de Dados


Embora tenha apenas um comando, a DQL é a parte da SQL mais utilizada. O comando
SELECT permite ao usuário especificar uma consulta ("query") como uma descrição do resultado
desejado. Esse comando é composto de várias cláusulas e opções, possibilitando elaborar consultas
das mais simples às mais elaboradas.

Antes de abordar comandos da linguagem TRANSACT-SQL, vamos conhecer o ambiente do SQL


Server que será utilizado para digitar os comandos da DDL e da DML. Para isso, basta clicar no botão “New
Query” disposto na barra de ferramentas, mostrado abaixo:

Figura 42

Repare que ao clicar no botão “New Query”, foi aberta uma janela, mostrada acima pela seta em
vermelho.

Novos botões foram criados na barra de ferramentas, a fim de possibilitar a criação/uso de instruções
da Transact-SQL:

- Botão “Parse”: Usado para analisar a falta ou não de parâmetros de um comando SQL digitado;

- Botão “Execute” – Usado para executar as instruções SQL digitadas ou selecionadas;

Professor: Alberson Wander Página: 30


Banco de Dados UNIVAP - CTI

- Botão ”Cancel Executing Query” – Usado para cancelar a execução de uma instrução que estiver
sendo executada;

- Nome do banco de dados ativo, ou seja, banco no qual as instruções


SQL, digitadas na área de edição de comando, irão agir.

Veja abaixo a figura que ilustra a execução de uma instrução SQL, que exibirá todos os dados de
professores, cadastrados na tabela “professores”, no banco de dados “UNIVAP”:

Figura 43

Repare que o SQL exibe o resultado da consulta num local chamado “painel de resultados”. Este painel
é visto na tela acima, apontado pela seta.

IMPORTANTE: O banco de dados “UNIVAP” deve ter sido selecionado antes de clicar no botão
“Execute”. Se isso não for feito, a instrução digitada poderá retornar mensagens de erros se não existir a tabela
e campos indicados nas referidas instruções Transact-SQL.

11.1 – SALVANDO OS REGISTROS DO PAINEL DE RESULTADOS

Podemos salvar os registros exibidos no painel de resultados quando está em forma de grid, a fim de
acessá-los em outros softwares. Para salvar o painel de resultados, basta clicar sobre qualquer linha de
registro exibida e seguir os seguintes passos:

1. Clique no menu “File”, e em seguida em “Save SQLQuery1.sql”

Surgirá a seguinte janela:

Professor: Alberson Wander Página: 31


Banco de Dados UNIVAP - CTI

Figura 44

Na janela acima, você deve informar:

File Name: Local onde você deve definir o nome do arquivo que armazenará o resultado exposto no
grid;

Save Type: Determina o tipo de arquivo que será criado. Normalmente para acessarmos estes dados
por outros programas, podemos gravar os resultados do painel de resultados em formato TEXTO. Nesta caixa
estão disponíveis outros tipos de arquivos, tais como “SQL files”, “Text Files” ou “All Files”.

Botão “Save”: Por fim, clique neste botão para o arquivo ser gerado fisicamente.

11.2 – CRIANDO, ALTERANDO, EXCLUINDO VISÕES OU VISUALIZANDO REGISTROS FILTRADOS POR


“VISÕES”

Podemos criar/executar/excluir/alterar uma visão por meio de comandos. Estes devem ser utilizados na
área de edição de comandos SQL, depois de clicado o botão “New Query”.

Para criarmos uma visão, basta usarmos a sintaxe abaixo:

Create View <nomevisão>


AS
<instrução Select>

Por exemplo, vamos criar uma Visão para exibirmos todos os dados de professores cadastrados, que
possuam a idade superior ou igual há 30 anos. Para isso, digite o comando conforme exemplo a seguir e
pressione o botão “Execute”:

Professor: Alberson Wander Página: 32


Banco de Dados UNIVAP - CTI

Figura 45

Quando a sintaxe digitada estiver correta e o botão “Execute” for pressionado, a mensagem
“Command(s) completed successfully” aparecerá no painel de resultados, conforme visto na figura acima.

Podemos alterar ou excluir uma visão criada, para isso devemos usar os comandos Alter View ou Drop
View, respectivamente.

No comando Alter View, deveremos digitar novamente todos os comandos que irão compor a “Visão”.
Para isto usaremos a seguinte sintaxe:

Alter View <nome_da_visão_criada>


As
<NOVO Comando SELECT>

Baseado no exemplo da última figura se desejasse alterar a visão criada, por exemplo, para
selecionarmos todos os dados de professores que tivessem idade INFERIOR a 30 anos, escreveríamos o
seguinte comando:

Alter view mostratodos


As
Select * from professores
Where idadeprofessor < 30

Após pressionar o botão , você verá novamente a mensagem “Command(s) completed


successfully”, que indicará que a sua “View” foi alterada corretamente.

Para excluir uma visão por meio de comando, basta usar a seguinte sintaxe:

Drop View <nome_da_visão_criada>

Se desejarmos apagar, por exemplo, a “View” criada nos exemplos anteriores, basta digitarmos:

Drop view mostratodos

Professor: Alberson Wander Página: 33


Banco de Dados UNIVAP - CTI

Em seguida, pressione o botão . Se não ocorrer algo errado, novamente a mensagem


“Command(s) completed successfully” aparecerá no painel de resultados.

Para visualizarmos os registros filtrados por uma visão anteriormente criada, basta seguir os passos
ilustrados na figura a seguir:

Figura 46

Serão mostrados os registros filtrados pela instrução SELECT criada dentro da View, conforme mostra
a seta na figura acima.

O resultado exibido na figura anterior pode ser gravado da mesma forma que um resultado de
instruções digitadas na área de edição de comandos. Para isso, siga os passos descritos no item 11.1 desta
apostila.

Podemos usar os assistentes para criar, alterar e excluir “Visões”, como vimos anteriormente.

12 – TRANSACT SQL (DDL)

No SQL-SERVER é possível criar banco de dados, tabelas, relacionamentos entre as mesmas, gravar
registros, excluí-los, alterá-los e consultá-los, tudo através de instruções a linguagem SQL ((Structured Query
Language), conhecida como TRANSACT SQL.

Como citado anteriormente, os comandos da Transact SQL são divididos em grupos, conhecidos como
DDL (DATA DEFINITION LANGUAGE) e DML (DATA MANIPULATION LANGUAGE).

Vamos conhecer os principais comandos da DDL e da DML.

12.1 – CRIANDO BANCO DE DADOS (DDL)

Para criarmos um banco de dados no SQL, usamos a seguinte sintaxe:

CREATE DATABASE <nome_do_banco_dados>

Professor: Alberson Wander Página: 34


Banco de Dados UNIVAP - CTI

Exemplo:
Create database LOJA

Quando for executado o comando acima, serão criados fisicamente os arquivos .MDF e .LOG,
referentes ao banco de dados LOJA. Os arquivos serão criados automaticamente, pelo SQL SERVER, na
pasta do servidor. Após a execução do comando acima será exibida a seguinte mensagem:

Command(s) completed successfully.

12.2 – EXCLUINDO BANCO DE DADOS (DDL)

Quando necessário, podemos utilizar o comando DROP DATABASE, para excluir fisicamente um
banco de dados existente.

Sintaxe:

DROP DATABASE <nome_do_banco_dados>

Exemplo:
Drop database loja

È importante salientar que ao excluir um banco de dados, todo seu conteúdo também será excluído, ou
seja, tabelas, registros, visões, stored procedures, triggers e etc, serão perdidos com a exclusão.

12.3 – CRIAÇÃO DE TABELAS NUM BANCO DE DADOS (DDL)

Para criação de tabela em um banco de dados usamos o comando Create Table.

Sintaxe:

CREATE TABLE <nome_da_tabela)


(
<campo1> <tipo_campo> [primary key] [ not null ] ,
......
<campon> <tipo_campo> [not null]
)

Exemplo 1:
Create table cliente
(
Codcli int primary key not null,
Nomecli char(30) not null,
Endcli varchar(40),
Telcli varchar(25)
)

No exemplo acima está sendo criada a tabela cliente. Os campos desta tabela serão: Codcli do tipo
inteiro, será chave primária e exigirá dados no momento do cadastro de um registro; Nomecli do tipo caracter,
armazenará 40 dígitos, também exigirá dados no momento da gravação do registro; endcli do tipo varchar,
capaz de armazenar no máximo 40 dígitos no momento da gravação de um registro, porém, não é um campo
de preenchimento obrigatório; telcli do tipo varchar, capaz de armazenar no máximo 25 caracteres no momento
da gravação de um registro, porém, não é um campo de preenchimento obrigatório.

IMPORTANTE: no exemplo acima somente o campo codcli é chave primária da tabela cliente.

Professor: Alberson Wander Página: 35


Banco de Dados UNIVAP - CTI

Exemplo 2:
Create table depentedentecliente
(
Codcli int not null,
Coddependente int not null,
Nomedep char(40),
Idadedep int,
Primary key (codcli, coddependente)
)

IMPORTANTE: no exemplo acima, repare que os campos codcli E coddependente compõem a chave
primária desta tabela. As demais definições são as mesmas do exemplo 1. Portanto, sempre que uma tabela
possuir mais de um campo compondo a chave primária, a definição deve ser feita como no exemplo acima.

12.4 –ALTERAÇÃO DE ESTRUTURA DE TABELA DE UM BANCO DE DADOS (DDL)

Para alterarmos a estrutura de uma tabela criada usaremos o comando ALTER TABLE.

Sintaxe:
Para excluir um campo de uma tabela:
ALTER TABLE <nome_da_tabela_existente>
DROP COLUMN <nome_campo>

OU
Sintaxe:
Para adicionar um campo na tabela:
ALTER TABLE <nome_da_tabela_existente>
ADD <nome_campo> <tipo_dado>

OU
Sintaxe:
Para alterar o TIPO DE DADO de um campo da tabela
ALTER TABLE <nome_da_tabela_existente>
ALTER COLUMN <nome_campo> <tipo_dado>

OU
Sintaxe:
Para renomear um campo da tabela usa-se o MÉTODO SP_RENAME:
SP_RENAME ‘<nome_tabela>.<nome_antigo_campo>’ , <novo_nome_campo>

OU
Sintaxe:
Para inserir uma chave primária numa tabela criada anteriormente:
ALTER TABLE <nome_da_tabela_existente>
ADD CONSTRAINT <nome_chave> PRIMARY KEY (<nome_campo>)

OU
Sintaxe:
Para excluir uma chave primária numa tabela criada anteriormente:
ALTER TABLE <nome_da_tabela_existente>
DROP CONSTRAINT <nome_chave>

OU
Sintaxe:
Para inserir uma chave estrangeira numa tabela criada anteriormente:
ALTER TABLE <nome_da_tabela_filho_jacriada >
ADD FOREIGN KEY (<nome_campo_chaveestrangeira>)
REFERENCES <nome_tabela_pai> ( <chave_primaria_tabela_pai> )
ON DELETE CASCADE
ON UPDATE CASCADE

Professor: Alberson Wander Página: 36


Banco de Dados UNIVAP - CTI

Exemplo 1:
Alter table cliente
drop column telcli

Neste exemplo está sendo excluído o campo telcli da tabela cliente

Exemplo 2:
Alter table cliente
add telefonedocli varchar(25)

Neste exemplo está sendo adicionado na tabela cliente o campo chamado telefonedocli, tipo varchar
de 25,

Exemplo 3:
alter table cliente
alter column telcli varchar(20)

Neste exemplo está sendo alterado o tipo de dado do campo telcli para varchar(20)

Exemplo 4:
SP_RENAME 'CLIENTE.telcli' , telefonecli

Neste exemplo está sendo renomeado o campo telcli, da tabela cliente, para telefonecli. Neste caso
repare que não foi usada a instrução alter table, mas sim o MÉTODO SP_RENAME.

Exemplo 5:
alter table Vendas
add constraint chave PRIMARY KEY (nvenda, codcli)

Neste exemplo está sendo criado na tabela copiavendas a chave primaria composta chamada “chave”,
pois os campos nvenda e codcli compõem a chave primária. OBS: PARA O COMANDO ACIMA FUNCIONAR,
OS CAMPOS NVENDA e CODCLI DEVEM TER SIDO CRIADO ANTERIORMENTE COM A PROPRIEDADE
NOT NULL.

Exemplo 6:
alter table Vendas
drop constraint chave

Neste exemplo está sendo excluída a chave primária que foi criada no exemplo anterior. A chave
primária possui o nome “chave”.

Exemplo 7:
alter table vendas
add foreign key (codcli) references cliente(codcli)
on delete cascade on update cascade
Neste exemplo está sendo criada uma chave estrangeira para a tabela vendas e relacionando-a com a
tabela cliente. As cláusulas “on delete cascade” e “on update cascade” são opcionais.

12.5 – EXCLUSÃO DE TABELA DE UM BANCO DE DADOS (DDL)

Para exclusão de uma tabela de um banco de dados usamos o comando Drop table.

Sintaxe:

DROP TABLE <nome_tabela>

Exemplo:
Drop table cliente

No exemplo acima a tabela cliente está sendo excluída de um banco de dados em uso.

Professor: Alberson Wander Página: 37


Banco de Dados UNIVAP - CTI

12.6 – RELACIONANDO TABELAS DO BANCO DE DADOS (DDL)

No momento da criação de uma tabela FILHO, em uma relação, poderemos definir o relacionamento
dessa com a tabela pai. Para isso usamos a seguinte cláusula no comando create table:

Sintaxe:

CREATE TABLE <nome_da_tabela)


(
<campo1> <tipo_campo> [primary key] [ not null ] ,
......
<campon> <tipo_campo> [not null] ,

FOREIGN KEY <campo_chave_estrangeira_desta_tabela)


REFERENCES <nome_tabela_pai> ( <campo_chaveprimaria_tabela_pai>
ON DELETE CASCADE
ON UPDATE CASCADE
)

Para criar uma tabela FILHO numa relação, É NECESSÁRIO CRIAR ANTES A TABELA PAI, pois,
como é percebido na sintaxe, será necessário referenciar a tabela pai criada anteriormente.

Exemplo 1:
Create table cliente
(
Codcli int primary key not null,
Nomecli char(30) not null,
Endcli varchar(40),
Telcli varchar(25)
)

create table produtos


(
codproduto int primary key,
nomeproduto char(30)
)

create table produtoscliente


(
codcliente int,
codproduto int,
primary key (codcliente, codproduto),
foreign key (codcliente) references cliente(codcli)
on delete cascade
on update cascade,
foreign key (codproduto) references produtos(codproduto)
on delete cascade
on update cascade
)

NO EXEMPLO ACIMA, PERCEBA QUE:


1) AS TABELAS cliente E produtos FORAM CRIADAS ANTES DA TABELA produtoscliente.
2) Após a indicação da primeira chave estrangeira da tabela produtoscliente (codcliente), indicou-se
que exclusões e atualizações de registros na tabelas pai (cliente) reproduzirão o efeito cascata na
tabela produtoscliente. Em seguida, DEVE SER COLOCADA UMA VÍRGULA (,) para indicarmos a
segunda chave estrangeira (codproduto)

Para visualizarmos o relacionamento criado entre as tabelas criadas acima, deveremos abrir o banco
de dados e o diagrama. Você irá perceber que ao abrir o objeto “diagrams” no banco de dados, não existirá
nenhum diagrama de relacionamento disponível. PORÉM, faça uso dos passos indicados no item 7.5.4 desta
apostila, para visualizar as tabelas já relacionadas. Após adicionar as tabelas na área de relacionamento você
irá visualizar o relacionamento. Em seguida, basta gravá-lo fisicamente. Se tudo der certo você verá o seguinte
resultado:

Professor: Alberson Wander Página: 38


Banco de Dados UNIVAP - CTI

Figura 47

Exemplo 2: Neste exemplo, vamos incluir uma nova tabela no relacionamento feito no exemplo 1. A
tabela abaixo irá receber dados da tabela produtoscliente. Pelo fato da tabela produtoscliente possuir uma
chave primária COMPOSTA, a tabela filho, que será criada com o comando mostrado abaixo, deve referenciar
a chave composta da tabela pai. Vejamos:

create table datacomprasprodutos


(
datacompra datetime not null,
codclien int not null,
codprod int not null,
primary key (datacompra, codclien, codprod),
foreign key(codclien, codprod) references produtoscliente(codcliente, codproduto)
on delete cascade
on update cascade
)

OBSERVAÇÃO: LEMBRE-SE QUE VOCÊ DEVERÁ ADICIONAR ESTA ÚLTIMA TABELA NO DIAGRAMA JÁ
CRIADO. Para isso, primeiramente abra novamente a área “Database Diagrams” do banco de dados. Em
seguida, pressione o BOTÃO DIREITO DO MOUSE sobre qualquer local da área que exibe as tabelas já
relacionadas. No submenu que irá surgir, selecione a opção “Add Table...”, conforme figura a seguir:

Professor: Alberson Wander Página: 39


Banco de Dados UNIVAP - CTI

Figura 48

Surgirá a janela “Add Table”. Se a janela não exibir o nome da última tabela criada, pressione o botão
“Refresh”. A janela deverá ter a seguinte aparência:

Figura 49

Após clicar no botão “Add” o diagrama de relacionamento deverá ser atualizado, conforme a figura a
sseguir:

Professor: Alberson Wander Página: 40


Banco de Dados UNIVAP - CTI

Figura 50

12.7 – CRIAÇÃO DE CAMPO AUTONUMERAÇÃO (INCREMENTO AUTOMÁTICO) (DDL)

Para criação de um campo de incremento automático em uma tabela, usaremos a PROPRIEDADE


IDENTITY vinculado ao mesmo, no momento da criação da tabela.

Quando a PROPRIEDADE IDENTITY for utilizada em uma tabela, saiba que:


• Os registros para o campo definido com IDENTITY são gerados pelo sistema de forma seqüencial;
• É permitido somente um único campo IDENTITY por tabela;
• O campo não pode ser alterado por um comando UPDATE;
• Deve ser usado somente para campos do tipo: tinyint, smallint, int, numeric, decimal

Sintaxe:

IDENTITY [(valor_inicial, incremento)]

Onde:
Valor_inicial: indica o valor para o primeiro registro gravado;
Incremento: indica qual o valor será acrescido para cada registro gravado

Exemplo: No exemplo abaixo indicamos que no campo aluno_id iniciará com 1, quando o primeiro
registro for gravado. A partir daí, sempre que um novo registro for cadastrado, será somado automaticamente 1
no campo aluno_id, fazendo com isso, que nunca se repita os números de identificação de alunos na tabela.

CREATE TABLE aluno


(
aluno_id INT IDENTITY (1, 1),
nome VARCHAR(20)
)

O exemplo acima, foi criado o campo aluno_id, na tabela aluno. Quando desejar gravar um registro na
tabela aluno, NÃO SERÁ NECESSÁRIA a indicação do dado para o campo aluno_id, pois, como descrito
anteriormente, o próprio sistema irá gerar o número do aluno automaticamente. Veja abaixo o exemplo de
como os registros devem ser cadastrados na tabela aluno:

INSERT aluno VALUES ('Mirtes') // Será criado com aluno_id = 1


INSERT aluno VALUES ('Wagner') // Será criado com aluno_id = 2

Professor: Alberson Wander Página: 41


Banco de Dados UNIVAP - CTI

13 – TRANSACT SQL (DML)

Para exemplificar os próximos comandos da Transact-SQL, usaremos as seguintes tabelas mostradas


no diagrama abaixo:

Figura 51

Para os exemplos dos comandos da DML, devemos conhecer os tipos de dados de cada campo. Por
esse motivo o diagrama de relacionamento das tabelas foram mostradas acima no modo STANDARD.

13.1 – COMANDO INSERT (DML)

O comando Insert é usado para gravar registro numa tabela do banco de dados ativo.

Sintaxe:

INSERT INTO <nome_tabela> ( campo1, ..... , campoN)


VALUES ( <dado_campo1> , ..... , <dado_campoN>)

Exemplo 1:
insert into cliente (codcli, nomecli, endcli, telefonecli)
values ( 1, 'joão da silva', 'rua JK 127', '(012) 3939-3021' )

Neste exemplo estamos cadastrando o cliente com o código 1, nome joão da silva, que reside à rua JK
127, com o telefone (012) 3939-3021, na tabela cliente.

OBSERVAÇÃO: A ordem dos dados indicados dentro da cláusula values, deve obedecer à mesma
ordem dos campos descritos após o nome da tabela. No exemplo acima descrevemos o campo codcli para
receber o número 1 e assim sucessivamente.

Exemplo 2:
insert into cliente values ( 1, 'joão da silva', 'rua JK 127', '(012) 3939-3021' )

Neste exemplo, repare que foram omitidos os nomes de campos que receberão os dados descritos na
cláusula values. Com isso, os dados serão gravados respectivamente obedecendo à ordem de criação dos
campos na tabela, ou seja, codcli, nomecli, endcli e telefonecli. Para usar esta sintaxe, o usuário deve conhecer
a ordem dos campos na tabela.

Exemplo 3: Vamos supor que tenha sido criada a tabela clientetemporario e que esta não tenha sido
relacionada a nenhuma tabela. Logo em seguida, usando o comando Insert, gravamos 4 registros de clientes.
Vejamos:
create table clientetemporario
(
codcliT int primary key,
nomecliT char (30)
)

Professor: Alberson Wander Página: 42


Banco de Dados UNIVAP - CTI

insert into clientetemporario values (2, 'alberson')


insert into clientetemporario values (3, 'wagner')
insert into clientetemporario values (4, 'julia')
insert into clientetemporario values (5, 'maria josé')

Agora vamos fazer outro teste, cadastrando todos os professores da tabela clientetemporario, na tabela
cliente. Vale lembrar que os campos das duas tabelas devem possuir tamanhos e tipos IDÊNTICOS. Veja o
exemplo abaixo:

insert into cliente(codcli, nomecli) select codcliT, NomecliT from clientetemporario

O exemplo acima, seleciona codcliT e NomecliT de todos os registros gravados na tabela


clientetemporario. Em seguida, os registros filtrados são gravados automaticamente na tabela cliente, nos
campos codcli e nomecli. Esta sintaxe poderia também ser escrita da seguinte forma:

insert into cliente(codcli, nomecli) select * from clientetemporario

IMPORTANTE: Nos dois últimos exemplos, torna-se necessária a indicação dos nomes de campos que
RECEBERÃO os registros filtrados da tabela clientetemporario, isto porque as tabelas não possuem a mesma
quantidade de campos.

Após a execução de um dos dois últimos exemplos, os registros serão gravados da seguinte forma, na
tabela cliente:

1 joão da silva rua JK 127 (012) 3939-3021


2 alberson NULL NULL
3 wagner NULL NULL
4 julia NULL NULL
5 maria josé NULL NULL

Repare que os registros de clientes com código maior ou igual a 2, não possuem endereços
residenciais e telefones, isto porque na tabela clientetemporario estes dados não existem.

Exemplo 4:
Insert into datacomprasprodutos values (‘12/31/08’, 1, 1020)

Este exemplo grava um produto de um cliente no dia 31/12/2008 na tabela datacomprasprodutos.


Repare que a data, quando cadastrada, deve ser indicada no formato de padrão AMERICANO.

13.2 – OPERADORES RELACIONAIS, OPERADORES LÓGICOS e OPERADORES ARITIMÉTICOS DO


SQL SERVER

A seguir estão dispostos a relação dos operadores ARITIMÉTICOS, LÓGICOS E RELACIONAIS, mais
utilizados na linguagem Transact-SQL.

OPERADOR UTILIDADE
RELACIONAL
OPERADOR UTILIDADE = Igual
ARITMÉTICO <> Diferente
* Multiplicação > Maior que
+ Soma < Menor que
/ Divisão >= Maior ou igual
- Subtração <= Menor ou igual
% Módulo !< Não menor que
|| Concatenação !> Não maior que
!= Não igual

Professor: Alberson Wander Página: 43


Banco de Dados UNIVAP - CTI

OPERADOR UTILIDADE
LÓGICO
Not Inverte o valor booleano
And E
Or Ou
Between Entre
Like Usado para encontrar padrões de strings
IN Usado para verificar se conteúdo do campo possui algum valor estipulado

13.3 – COMANDO UPDATE (DML)

Este comando é usado para alterar registros gravados numa tabela.


Sintaxe:

UPTADE <nome_tabela>
SET <nome_campo> = <novo_valo>
WHERE <critérios_para_alteração>

Exemplo 1:
Update cliente
Set endcli = ‘nenhum’

O exemplo acima irá alterar os endereços de TODOS os clientes para ‘nenhum’, isto porque não foram
definidos critérios (CONDIÇÕES) para indicar quais os registros seriam alterados.

Exemplo 2:
Update cliente
Set endcli = ‘Rua da morte’
Where codcli = 1

O exemplo acima irá alterar somente o endereço do cliente que possui o código igual a 1, para ‘Rua da
morte’.

Exemplo 3:
Update cliente
Set endcli = ‘Rua JK’ , telefonecli = ‘(012) – ‘
Where codcli = 1

O exemplo acima altera o endereço do cliente para ‘Rua JK’ e o telefone do cliente para ‘(012) – ‘, do
cliente cujo código é 1.

Os operadores Relacionais, Lógicos e Aritméticos que podem ser utilizados em instruções Transact-
SQL estão relacionados no item 13.2 desta apostila.

13.3 – COMANDO DELETE (DML)

Este comando é usado para excluir REGISTROS de uma tabela.

Sintaxe:

Delete from <nome_tabela>


Where <condição_critérios_exclusão>

Exemplo 1:
Delete from produtos
Where nomeproduto like ‘a%’

No exemplo acima serão excluídos da tabela produtos, todos os produtos cujo nome inicie com a letra
“a”.

Professor: Alberson Wander Página: 43


Banco de Dados UNIVAP - CTI

Perceba que não foi informado nenhum nome de campo após o comando delete, antes da cláusula
“from”, pois, o comando delete exclui o registro TODO e não somente o conteúdo de um campo da tabela.

Poderemos usar outros CURINGAS juntamente com o operador LIKE, vejam alguns exemplos:

Nomecli Like ‘a[ul]ber[sc]on%’ Filtra registros que nomecli inciem com a letra “a”; o
segundo dígito seja “u” OU “l”; a partir do 3º dígito
contenha a seqüência “ber”; 6º dígito seja “s” OU “c”;
7º e o 8º dígito sejam “on” e que terminem com
quaisquer outros caracteres.
Nomecli like ‘%e%’ Filtra registros que nomecli contenha a letra “e”
disposta em qualquer local da string gravada
Nomecli like ‘%e’ Filtra registros que nomecli termine com a letra “e”
Nomecli like ‘e%’ Filtra registros que nomecli inicie com a letra “e”
Nomecli like ‘[a – c]%’ Filtra registros que nomecli inicie com qualquer
caractere entre as letras “a” e “c”
Nomecli like ’joão’ Filtra registros que nomecli seja EXATAMENTE igual
a “joão”, pois o curinga % não foi utilizado na sintaxe.

É bom dizer que o operador like pode ser usado em qualquer instrução SQL QUE POSSUA A
CLÁUSULA WHERE e que o campo usado para filtro SEJA DO TIPO CHAR ou VARCHAR.

13.5 – COMANDO SELECT (DQL)

Este comando é um dos comandos mais utilizados no SQL, pois é usado para filtrar registros de uma
ou várias tabelas provendo com isso a criação de uma nova tabela temporária na memória do computador.

Sintaxe 1 :

Select <campo1> , .... , <campoN>


From <nome_tabela1> , .... , <nome_tabelaN>
Where <critérios_filtros_registros>

Exemplo 1:
Select * from cliente

Mostrará codigo, nome, endereço e telefone de todos os clientes cadastrados. O “*”substitui o nome de
todos os campos no exemplo acima. Pelo fato do exemplo não conter cláusula WHERE, todos os registros
serão mostrados para o usuário.

Exemplo 2:
Select nomecli, codcli from cliente where endcli = ‘Rua JK’ and telefonecli like ‘012%’

O exemplo acima exibirá nome(s) e código(s) do(s) cliente(s) que resida(am) na ‘Rua JK’ E QUE O
telefone inicie com ‘012’. A ordem de exibição dos campos será nome do cliente e código do cliente.

Professor: Alberson Wander Página: 44


Banco de Dados UNIVAP - CTI

14 – EXEMPLOS GERAIS DE INSTRUÇÕES TRANSACT-SQL

Para os novos exemplos de instruções SQL, iremos usar as seguintes tabelas relacionadas:

Figura 52

14.1 –PARÂMETRO DISTINCT

Este parâmetro é usado com o comando SELECT. O distinct retorna somente registros diferentes de
uma coluna da tabela.

Exemplo:
Select distinct datavenda from vendas

O exemplo acima mostrará somente data de vendas DIFERENTES, gravadas na tabela vendas.
Lembre-se que várias vendas são realizadas numa data. Se o distinct não fosse usado, as datas de vendas
apareceriam várias vezes, pois corresponderiam as vendas efetuadas para cada dia.

14.2 – PARÂMETRO ORDER BY

Este parâmetro é usado com o comando SELECT para ordenar os registros filtrados. Podemos ordenar
os registros por vários campos filtrados de maneira ascendente (crescente) ou descendente (decrescente).

Exemplo:
Select * from cliente where idadecli between 15 and 21 order by idadecli asc, nomecli desc

O exemplo acima irá mostrar todos os dados do cliente que possui idade entre 15 e 21 anos
(BETWEEN). Neste caso, os registros filtrados serão ordenados primeiramente pela idade, de forma crescente.
Caso existam clientes com a mesma idade, os registros serão ordenados pelo nome do cliente, de forma
decrescente.

14.3 – UNION (UNINDO CAMPOS DE VÁRIAS TABELAS NUMA CONSULTA – ASSOCIAÇÃO INTERNA)

Usando o comando SELECT podemos filtrar vários dados de diversas tabelas, usando somente uma
instrução SELECT para filtrar registros.

Professor: Alberson Wander Página: 45


Banco de Dados UNIVAP - CTI

Exemplo 1:
Select CLIENTE.nomecli, PRODUTOSVENDIDOS.*, VENDAS.*, PRODUTOS.nomeproduto
From cliente, produtosvendidos, vendas, produtos
Where VENDAS.nvenda = 1 AND VENDAS.codcliente = CLIENTE.codcli AND
PRODUTOSVENDIDOS.nvenda = VENDAS.nvenda AND
PRODUTOSVENDIDOS.codproduto = PRODUTOS.codproduto

Observe o exemplo acima:


1) Os campos exibidos serão: Nome do cliente, gravado na tabela cliente; Todos os campos da tabela
produtos vendidos; Todos os campos da tabela vendas; Nome do produto gravado na tabela
produtos;
2) Na cláusula FROM, perceba que os registros serão filtrados das tabelas cliente, produtosvendidos,
vendas e produtos;
3) O primeiro critério de filtro é que o número da venda seja 1.
4) Os trechos da sintaxe exposta em VERMELHO indicam os relacionamentos entre as tabelas. Isto
deve ser feito para que sejam filtrados os registros EQUIVALENTES nas tabelas relacionadas. Só
serão filtrados registros se, E SOMENTE SE:
a. existir a venda número 1 cadastrada;
b. existir o registro do cliente que comprou na venda 1;
c. existir pelo menos UM produto vendido (produtosvendidos) na venda 1;
d. existirem na tabela produtos, os mesmos código de produtos cadastrados em
produtosvendidos referente à venda 1.

Exemplo 2:
Select CLIENTE.nomecli, VENDAS.codcliente, VENDAS.nvenda
From cliente, vendas
Where VENDAS.nvenda = 1 AND VENDAS.codcliente = CLIENTE.codcli

Observe no exemplo acima:


1) Os campos exibidos serão: o nome do cliente, gravado na tabela CLIENTE; o código do cliente e o
número da venda, gravados na tabela VENDAS;
2) Na cláusula FROM são indicados os nomes das tabelas de onde os registros serão filtrados;
3) O trecho da sintaxe exposta em VERMELHO indica o relacionamento entre as tabelas VENDAS e
CLIENTE. Portanto, com isso, só será exibido algum registro se, e somente se, o código do cliente
cadastrado na venda existir também na tabela cliente. Isso foi feito para que o nome do cliente da
venda 1 pudesse ser exibido no resultado da consulta, pois, como se percebe o nome do cliente
não é cadastrado na tabela VENDAS.

14.4 – GERANDO EXPRESSÕES EM INSTRUÇÕES SQL

Assim como em qualquer linguagem, a transact-SQL nos permite efetuar cálculos durante a execução
de comandos.

Diante do último diagrama de relacionamentos mostrado, avaliemos os seguintes comandos:

a) Update produtosvendidos set subtotal = qtdevendida * valorvenda

Explicando o comando acima:


O comando acima irá atualizar todos os subtotais gravados na tabela produtosvendidos. O novo valor
para o campo subtotal, será resultante da multiplicação de valores armazenados no campo qtdevendida pelos
valores armazenados no campo valorvenda. Todos os registros serão atualizados, pois não foram
estabelecidos critérios na cláusula WHERE.

b) Select codproduto , valorvenda * 1.10 as [ Valor com 10%] from produtosvendidos

Explicando o exemplo acima:


O comando acima irá mostrar códigos de produtos e valores dos produtos acrescido de 10%. Todos os
registros gravados na tabela produtosvendidos serão mostrados. O rótulo “Valor com 10%”, escrito dentro dos
colchetes, na sintaxe acima, indica o rótulo da coluna que será gerada na tabela temporária para o usuário.
Vale dizer que o valorvenda não será mostrado, ele apenas foi usado para ser multiplicado por 1.10, gerando

Professor: Alberson Wander Página: 46


Banco de Dados UNIVAP - CTI

com isso o acréscimo de 10%. É importante dizer também que o valorvenda, GRAVADO FISICAMENTE, não
é alterado, pois, o comando utilizado acima foi SELECT.

14.5 – FUNÇÕES

Além de podemos escrever nossas expressões na própria linha de comando SQL, podemos também
usar diversas funções existentes na SQL.
As funções mais importantes, utilizadas pela transact-SQL são as seguintes:

Funções de Manipulação de Dados Numéricos:

Função Parametro Resultado


ABS (numeric_expr) Valor Absoluto
CEILING (numeric_expr) Maior inteiro mais próximo ou igual ao valor
especificado
EXP (float_expr) Valor exponencial do valor especificado
FLOOR (numeric_expr) Menor inteiro mais próximo ou igual ao valor
especificado
LOG (float_expr) Logaritmo do numérico especificado
LOG10 (float_expr) Logaritmo de base 10
PI () Valor constante de 3.141592653589793
SQRT (float_expr) Raiz Quadrada
STR (float, qtdeinteiro, qtdedecimais) Converte um numero para string mostrando “n”
inteiro e “n” casas decimais

Exemplos:

a) Select codproduto, ceiling(subtotal) as [Sub Total Arredondado] from produtosvendidos

No exemplo acima todos os subtotais gravados serão arredondados para cima. Em seguida, serão
mostrados todos os códigos de produtos e o resultado arredondado dos subtotais, calculados para cada
produto. Pelo fato de não existirem critérios de filtros, todos os registros serão exibidos. O resultado
arredondado será armazenado na coluna “Sub Total Arredondado”.

b) Select codproduto, floor(subtotal) as [Sub Total Arredondado] from produtosvendidos

No exemplo acima todos os subtotais gravados serão arredondados para baixo. Em seguida, serão
mostrados todos os códigos de produtos e o resultado arredondado dos subtotais, calculados para cada
produto. Pelo fato de não existirem critérios de filtros, todos os registros serão exibidos. O resultado
arredondado será armazenado na coluna “Sub Total Arredondado”.

c) Select codproduto, abs(qtdevendida) as [Quantidade Vendida] from produtosvendidos

No exemplo acima, a quantidade vendida gravada, será convertida para valor absoluto, ou seja, não
poderá ser exibida uma quantidade negativa. Os valor ABSOLUTO (ABS()) serão armazenados na coluna
“Quantidade Vendida” na tabela temporária.

d) select str(valorvenda,10,2) as valor from produtosvendidos

No exemplo acima está sendo criada uma coluna na tabela temporária chamada “valor”. Todos os
valores de vendas, gravados na tabela produtosvendidos, serão mostrados com 10 números antes da
vírgula (se existirem) e com 2 casas decimais.

Professor: Alberson Wander Página: 47


Banco de Dados UNIVAP - CTI

Funções de Manipulação de Characteres ou Strings:

Função Parâmetro Resultado


+ (expressão, expressão) Concatena 2 ou mais character, strings ou colunas
LOWER (char_expr) Converte para minúscula
LTRIM (char_expr) Supressão dos espaços em branco à esquerda
PATINDEX ('%string%',expressão) Retorna a primeira posição da primeira ocorrência da string na
expressão definida, ou zero se a string não for encontrada
REVERSE (char_expr) Retorna o inverso do char_expr.
RIGHT (char_expr, integer_expr) Retorna n caracteres mais a direita da string
LEFT ( cha_expr , int_expr ) Retorna n caracters mais a esquerda da string
RTRIM (char_expr) Supressão de espaços em brancos à direita
SUBSTRING (expression, start, length) Retorna parte de uma string de caracteres.
UPPER (char_expr) Converte para maiúscula
REPLACE (char, sequ_proc, sequ_troc) Busca e Troca de caracteres numa seqüência definida

Exemplos:

a) Select ‘Produto : ‘ + nomeproduto from produtos

O exemplo acima irá mostrar nome do produto após a mensagem “Produto:”. Todos os produtos
cadastrados serão exibidos, pelo fato de não terem sido definidos critérios na cláusula WHERE. Veja
abaixo como os registros poderão ser exibidos:

Produto :café
Produto :leite

b) select lower(nomeproduto) as Produto from produtos

O exemplo acima irá mostrar uma coluna chamada “Produto” e nela serão exibidos todos os nomes de
produtos em letras minúsculas.

c) select upper(nomeproduto) as Produto from produtos

O exemplo acima irá mostrar uma coluna chamada “Produto” e nela serão exibidos todos os nomes de
produtos em letras maiúsculas.

d) select ltrim(endcli) as endereço from cliente

O exemplo acima irá retirar os espaços à esquerda dos endereços de clientes e os exibirá numa coluna
chamada “endereço”.

e) select rtrim(endcli) as endereço from cliente

O exemplo acima irá retirar todos os espaços à direita dos endereços de clientes gravados e os exibirá
numa coluna chamada “endereço”.

f) select PATINDEX('%s%',endcli) as [Posição do S] from cliente

O exemplo acima irá procurar pela letra s em qualquer parte de cada endereço de cliente cadastrado
na coluna endcli. Caso a letra “s” seja encontrada, será retornado o número da posição da mesma no
endereço. Se não for encontrada a letra “s” no endereço de cada cliente, será retornado 0.

g) select reverse(nomecli) as [Nome invertido] from cliente where codcli = 1

O exemplo acima mostrará o nome do cliente 1 invertido. O resultado será mostrado numa coluna
chamada “Nome Invertido”.

h) select right(bairrocli,10) as [Bairro] from cliente where codcli = 1

O exemplo acima irá retornar os 10 caracteres últimos caracteres do bairro do cliente 1.


IMPORTANTE: se o campo bairrocli foi criado como char(n) e se o conteúdo nele gravado não usar as N

Professor: Alberson Wander Página: 48


Banco de Dados UNIVAP - CTI

posições definidas, poderão ser retornados somente espaços em branco ou parte do que se imaginava
buscar.

i) select left((bairrocli),10) as [Bairro] from cliente where codcli = 1

O exemplo acima irá retornar os 10 primeiros caracteres do bairro do cliente 1.

j) select substring(cidadecli, 5, 3) as [Bairro] from cliente

O exemplo acima irá retornar 3 caracteres, a partir da posição 5, do nome da cidade dos clientes,
gravados na coluna cidadecli.

k) SELECT REPLACE(nomecli,'A','Ca') from cliente

O exemplo acima irá trocar “A” por “Ca”, na coluna nomecli na tabela cliente.

Funções de Manipulação de Datas:

Função Parâmetros Resultados


DATEADD (datepart, valor, date) Soma o VALOR correspondente datepart na data
especificada
DATEDIFF (datepart, date1, date2) Calcula a diferença definida em dateparts entre 2
datas
DATENAME (datepart, date) Especifica datepart para a data, retornando como
um valor ASCII (Ex: Setembro)
GETDATE () Data e hora corrente do computador
DAY (date) Retorna o dia da data informada
YEAR (date) Retorna o ano da data informada
MONTH (date) Retorna o mês da data informada

DatePart Abreviação Valor


Year Yy 1753 - 9999
Quarter Qq 1-4
Month Mm 1 - 12
day of year Dy 1 - 366
Day Dd 1 - 31
Week Wk 0 - 51
Weekday Dw 1 - 7 (1 é Domingo)
Hour Hh 0 - 23
Minute Mi 0 - 59
Second Ss 0 - 59
Millisecond Ms 0 - 999
EXEMPLOS:

a) select dateadd(yy,1,datavenda) from vendas

O exemplo acima está adicionando 1 ano na data da venda de todos os registros gravados em vendas.
É bom lembrar que fisicamente as datas da venda dos registros gravados continuarão as mesmas.
Somente na tabela temporária a data será exibida com o ano adicionado.

b) Select getdate()

O exemplo acima mostratá a data e hora do sistema.

c) select * from vendas where (datavenda) > '02/01/2008'

ATENÇAO: O EXEMPLO ACIMA EXIBIRÁ TODOS DADOS DE VENDAS, CUJA DATA DA


VENDA SEJA SUPERIOR A 01/FEVEREIRO/08. REPARE QUE A DATA, EXPRESSA NA
CLÁUSULA WHERE DEVE SER INDICADA NO FORMATO AMERICANO E ENTRE ASPAS
SIMPLES.

Professor: Alberson Wander Página: 49


Banco de Dados UNIVAP - CTI

d) select year(datavenda) as [ano], month(datavenda) as [mês], day(datavenda) as [dia] from vendas

O exemplo acima criar 3 colunas na tabela temporária, a saber: ano, mês e dia. Respectivamente,
nestas colunas, serão armazenados o ano, o mês e o dia das datas gravadas na coluna datavenda na
tabela vendas. Serão exibidos ano, mês e dia de todas as vendas gravadas, pois não existem critérios
definidos na cláusula WHERE.

Funções Agregadas:

AVG Retorna a média aritmética de uma coluna ou grupo


COUNT Retorna o total de elementos da coluna ou grupo
SUM Retorna o somatório de uma coluna ou grupo
MIN Retorna o menor valor de uma coluna ou grupo
MAX Retorna o maior valor de uma coluna ou grupo

Exemplos:

a) select avg(subtotal) as [Média] from produtosvendidos

O exemplo acima irá mostrar, numa coluna chamada “Média”, a média de todos os valores gravados na
coluna subtotal na tabela produtosvendidos. Caso fosse definido algum critério de seleção na cláusula
WHERE, a média seria somente dos registros filtrados pela condição.

b) select sum(subtotal) as [Total Faturado] from produtosvendidos

O exemplo acima irá mostrar, numa coluna chamada “Total Faturado”, o somatório de todos os valores
gravados na coluna subtotal na tabela produtos vendidos. Caso fosse definido algum critério de seleção na
cláusula WHERE, o somatório seria somente dos registros filtrados pela condição.

c) select count(*) as [Quantidade Vendas] from vendas

O exemplo acima irá retornar na coluna “Quantidade Vendas” quantas vendas estão gravadas na
tabela vendas.

d) Select count (nvenda) as [Quantidade Vendas] from vendas

O exemplo acima irá retornar a quantidade de números de vendas gravadas na coluna nvenda na
tabela vendas. O resultado retornado será exibido na coluna “Quantidade Vendas!”

e) select min(valorvenda) as [Preço] from produtos

O exemplo acima retornará o preço do produto mais barato gravado no campo valorvenda, na tabela
produtos. O preço será exibido numa coluna chamada “Preço”. Pelo fato de não existirem critérios definidos
na cláusula WHERE, todos os valores de vendas gravados no campo valorvenda serão avaliados para que
seja filtrado o MENOR valor.

f) select MAX(valorvenda) as [PREÇO] from produtos

O exemplo acima mostrará qual o maior valor de venda gravado no campo valorvenda, na tabela
produtos. O maior valor será exibido numa coluna chamada “PREÇO”. Pelo fato de não existirem critérios
definidos na cláusula WHERE, todos os valores de vendas gravados no campo valorvenda serão avaliados
para que seja filtrado o MAIOR valor.

g) SELECT sum(subtotal)* 1.10 as [Total da Venda]


FROM produtosvendidos
where nvenda = 1

O exemplo acima mostrará o total da venda 1 acrescentado de 10%. Repare que foi feita a soma de
todos os subtotais da venda 1 e em seguida, foram acrescidos os 10%. Neste caso a somatória (Sum()), foi
feita somente sobre os subtotais da venda 1, conforme definido no critério WHERE.

Professor: Alberson Wander Página: 50


Banco de Dados UNIVAP - CTI

h) Select count(distinct nvenda) as [Quantidade de vendas] from produtosvendidos

O exemplo acima irá contar quantos números de vendas DIFERENTES existem na tabela produtos
vendidos. O resultado da contagem será mostrado num campo da tabela temporária chamado “Quantidade
de Vendas”. Lembre-se que na tabela produtosvendidos, para cada produto vendido numa venda o número
dessa é gravado novamente, gerando-se desta forma redundâncias necessárias, pois com isso, estamos
relacionando os produtos de cada venda.

14.6 – USO DO OPERADOR IN

Este operador é útil na cláusula WHERE, pois, ele permite testar diversos valores definidos numa lista
para um campo da tabela.

Exemplo:

Select * from cliente where codcli in (1,2,9)

O exemplo acima irá mostrar todos os dados dos clientes cujos códigos sejam 1 OU 2 OU 9. Neste
caso o operador IN está substituindo o operador OR, que tornaria a sintaxe muito mais extensa.

14.7 – SUBCONSULTAS

Em algumas instruções SQL torna-se necessário realizarmos subconsultas. Para subconsultas,


usaremos os seguintes operadores:

OPERADOR UTILIDADE
> ALL Se o campo armazena registros maiores que todos os elementos da subconsulta
< ALL Se o campo armazena registros menores que todos os elementos da subconsulta
Se o campo armazena registros diferentes de todos os elementos da subconsulta (o
<> ALL
mesmo que NOT IN)
Se o campo armazena registros iguais a algum dos elementos da subconsulta (o
= ANY
mesmo que IN)
> ANY Se o campo armazena registros maiores que algum dos elementos da subconsulta
< ANY Se o campo armazena registros menores que algum dos elementos da subconsulta
Se o campo armazena registros diferentes de algum dos elementos da subconsulta
<> ANY
(falso se igual a todos)
Se campo armazena registros com valores iguais a algum dos elementos da
IN
subconsulta
Exists Verifica se a subconsulta gerou registros

Exemplos:

a) select codproduto, qtdevendida from produtosvendidos


where nvenda = 1 AND exists (select nvenda from vendas)

No exemplo acima os códigos de produtos e quantidade de produtos, vendidos da venda 1, gravados


na tabela produtosvendidos, SÓ SERÃO MOSTRADOS se, e somente se, existir a venda 1 na tabela
vendas

b) select produtos.nomeproduto, produtosvendidos.codproduto, produtosvendidos.qtdevendida


from produtosvendidos, produtos
where nvenda = 1 AND exists (select nvenda from vendas)
AND produtosvendidos.codproduto = produtos.codproduto

Repare neste exemplo que estamos buscando o nome do produto na tabela produtos. Portanto, as 3
condições escritas na cláusula WHERE deverão acontecer, para que os registros sejam exibidos. O trecho
em VERMELHO é uma condição que informa a ligação entre as tabelas produtosvendidos e produtos, ou
seja, somente os nomes de produtos vendidos na venda 1 deverão ser mostrados juntamente no resultado
retornado pelo comando select.

Professor: Alberson Wander Página: 51


Banco de Dados UNIVAP - CTI

c) delete from vendas


where nvenda = 1 AND NOT EXISTS( select * from produtosvendidos where nvenda = 1 )

O exemplo acima só irá excluir o registro da venda 1, na tabela vendas SE NÃO EXISTIREM produtos
vendidos desta venda gravados na tabela produtosvendidos. O comando acima trata de uma regra de
integridade de dados vista no início desta apostila, ou seja, só podemos apagar registros de uma tabela pai
se, e somente se, na tabela filho (produtosvendidos) tais registros não forem utilizados.

d) update produtosvendidos
set produtosvendidos.valorvenda = produtos.valorvenda
from produtos, produtosvendidos
where produtosvendidos.codproduto = produtos.codproduto
and exists (select * from produtosvendidos)

O exemplo anterior mostra o uso da cláusula FROM no comando UPDATE. O uso da cláusula FROM
foi necessário neste exemplo porque os valores de vendas dos produtos, gravados na tabela
produtosvendidos, deveriam ser atualizados para os mesmos valores gravados no campo valorvenda, na
tabela produtos. Outra observação importante refere-se ao fato de que a alteração só será executada se
existirem registros na tabela produtosvendidos (CONDIÇÃO EXISTS, DA CLÁUSULA WHERE).

e) select nvenda, codcliente


from vendas
where codcliente IN (select codcli from cliente)

O exemplo mostrará números de venda e o código dos clientes, gravados na tabela vendas,
SOMENTE DOS clientes cadastrados na tabela cliente. Lembre-se que ao usar o operador IN, todos os
valores inseridos dentro dos parênteses, servirão de parâmetros dos filtros de registros na tabela vendas,
ou seja, neste caso todos os códigos de clientes filtrados na tabela cliente, servirão para filtrar os registros
de vendas efetuadas para esses clientes.

f) select nvenda, codcliente


from vendas
where codcliente = ANY (select codcli from cliente)

Conforme definição do operador “=ANY”, mostrada na tabela no início deste item da apostila, sua
utilização têm a mesma função que o operador IN. Portanto, o comando acima realizará a mesma consulta
do exemplo dado na letra “e”.

14.8 – APELIDANDO TABELAS NAS CLÁUSULAS FROM

Este recurso é muito utilizado em instruções SQL. Determinando apelidos para tabelas diminuiremos
bastante o tamanho das instruções escritas. Vejam o exemplo abaixo:

select V.* , C.nomecli


from vendas V , cliente C
where V.codcliente = C.codcli

Neste exemplo estamos apelidando as tabelas Vendas com “V” e cliente com “C”. Dessa forma, toda
vez que desejarmos referenciar tais tabelas nas cláusulas das instruções, basta usarmos “V” ou “C”. Os
apelidos são determinados na cláusula FROM, portanto, será possível apelidarmos as tabelas somente em
instruções que fazem uso dessa cláusula.

IMPORTANTE:
• OS APELIDOS SÃO GERALMENTE UTILIZADOS PARA SIMPLIFICAR A INSTRUÇÃO,
REDUZINDO O CÓDIGO ESCRITO.
• GERALMENTE SÃO USADOS EM COMANDOS QUE FILTRAM DADOS DE DIVERSAS TABELAS,
COMO EXEMPLO DADO ACIMA QUE FILTRA DADOS DAS TABELAS “CLIENTE” E “VENDAS”.

Professor: Alberson Wander Página: 52


Banco de Dados UNIVAP - CTI

14.9 – CLÁUSULA GROUP BY... HAVING

A cláusula GROUP BY é utilizada geralmente para agrupar registros filtrados por uma instrução
SELECT. Geralmente utiliza-se o GROUP BY em conjunto com as funções AGREGADAS (MIN, MAX, SUM,
AVG e COUNT)

Já a cláusula HAVING deve ser usada em conjunto com a cláusula GROUP BY.

A cláusula HAVING tem a mesma função da cláusula WHERE , PORÉM as condições estabelecidas
na HAVING agirão sobre os registros AGRUPADOS, ou seja, depois do agrupamento dos registros filtrados.

FUNCIONAMENTO: No comando SELECT poderemos ter as cláusulas WHERE e HAVING (esta,


desde que o GROUP BY tenha sido escrito). Primeiramente os registros serão filtrados pelas condições
definidas na cláusula WHERE, em seguida, serão AGRUPADOS, e por fim, os critérios definidos na cláusula
HAVING agirão em tais registros, realizando outro filtro nos registros agrupados.

Exemplos:

a) select codcliente, count(*) as [Qtde vendas para cliente]


from vendas
group by codcliente

O exemplo irá contar e mostrar quantas vendas foram efetuadas para cada cliente. Primeiramente o
comando agrupa todos os códigos de clientes, em seguida, realiza-se a contagem de registros em cada
grupo, por fim, serão exibidos o código de cada cliente e a quantidade de vendas efetuadas para cada um
deles (Qtde vendas para cliente). LEMBRE-SE que na função COUNT não é necessário a indicação do
nome de um campo, pois a mesma contará REGISTROS.

b) select nvenda, sum(subtotal) as [total de cada venda]


from produtosvendidos
group by nvenda

Este exemplo agrupa os registros gravados na tabela produtosvendidos pelo nvenda. Em seguida, é
realizada a soma de todos os subtotais de cada venda. Por fim, são exibidos todos os nvendas agrupados
com seus devidos totais calculados.

c) select nvenda, sum(subtotal) as [total de cada venda com produto 1]


from produtosvendidos
where codproduto = 1
group by nvenda

Repare que no exemplo acima fazemos uso da cláusula WHERE. Com isso, será filtrados
primeiramente os registros de produtosvendidos que relacionam vendas do produto 1. Em seguida, os
registros filtrados serão agrupados pelo número da venda. Dessa forma, serão exibidos o somente o total
arrecadado com vendas do produto 1 em todas as vendas.

d) select cidadecli, avg(idadecli) as [Média Idade de Clientes]


from cliente
group by cidadecli

O exemplo acima mostra a média de idade de clientes de cada cidade cadastrada na tabela cliente.
Primeiro os registros são agrupados por cidade, em seguida, é calculado a média aritmética das idades dos
clientes ligados a cada grupo de cidade. Por fim, será exibido o nome da cidade com sua a devida média de
idade de clientes.

e) select cidadecli, avg(idadecli) as [Média Idade de Clientes]


from cliente
group by cidadecli
having avg(idadecli) >= 18

Neste exemplo, o nome da cidade e média de idade de clientes, serão exibidos somente se a média de
idade dos clientes for igual o superior a 18 anos. Percebam que neste exemplo a cláusula HAVING foi

Professor: Alberson Wander Página: 53


Banco de Dados UNIVAP - CTI

usada. Isso fará com que após o agrupamento e o cálculo da média de idade, seja feito um filtro dos
registros.

f) select cidadecli, avg(idadecli) as [Média Idade de Clientes]


from cliente
where idadecli >=18
group by cidadecli
having avg(idadecli) between 20 and 30

Neste exemplo perceba que ANTES de agrupar os registros e calcular a média de idade dos clientes,
foi realizado um filtro de registros, de tal forma que a média de idade dos clientes de cada cidade fosse
calculada somente entre os clientes com no mínimo 18 anos. O nome da cidade e a média de idade de
clientes só será exibida se a média calculada estiver entre 20 e 30 anos, pois o critério definido na cláusula
HAVING fará o filtro após o agrupamento.

14.10 – USO DOS PREDICADOS TOP e PERCENT

O uso do TOP em um comando SELECT fará com que sejam mostrados certo número de registros do
início ou do final da tabela em questão, especificado pela cláusula ORDER BY.

Torna-se necessário informar que você poderá exibir também uma porcentagem de registros diante
dos registros que seriam filtrados. Neste caso deverá usar PERCENT junto ao predicado TOP.

IMPORTANTE: O PREDICADO TOP NÃO CLASSIFICA REGISTROS IGUAIS. PORTANTO,


PODERÁ OCORRER QUE SEJAM FILTRADOS REGISTROS A MAIS DO QUE FORAM SOLICITADOS.

Exemplos:

a) select top 1 nvenda from vendas order by totalvenda desc

O exemplo mostrará o número da venda cujo total é o MAIOR entre os gravados na tabela vendas.
Veja que as vendas foram ordenadas pelo totalvenda de forma decrescente. Com isso o predicado TOP
forçará a exibição da primeira venda que possui o maior valor. Ressalta-se que se que se vários totais de
vendas possuírem o maior valor, ou seja, possuírem o mesmo totalvenda, todas serão exibidas, apesar da
sintaxe solicitar somente a primeira (Top 1).

b) select top 1 nvenda from vendas order by totalvenda asc

Já o exemplo acima, mostrará o número da venda cujo total vendido é o MENOR entre os gravados na
tabela vendas. Veja que as vendas foram ordenadas pelo totalvenda de forma crescente. Com isso o
predicado TOP forçará a exibição da primeira venda que possui o menor valor. Ressalta-se que se vários
totais de vendas possuírem o menor valor, ou seja, possuírem o mesmo totalvenda, todas serão exibidas,
apesar da sintaxe solicitar somente a primeira (Top 1).

c) select top 50 percent nvenda from vendas order by totalvenda asc

Será mostrado somente o número da venda de 50% das piores vendas efetuadas, ou seja, com
menores totalvenda gravados na tabela vendas.

15 – STORED PROCEDURE

Uma Stored Procedure nada mais é do que uma rotina de programação escrita em Transact-SQL, que
pode ser executada manualmente por um usuário do banco de dados ou até mesmo ser chamada por um
programa qualquer.

Uma Stored Procedure pode ou não receber parâmetros de entrada e retornam resultados para o
programa ou usuário que a pôs em execução.

Uma Stored Procedure pode chamar outra Stored Procedure.

Professor: Alberson Wander Página: 54


Banco de Dados UNIVAP - CTI

IMPORTANTE: COM EXCEÇÃO DOS COMANDOS CREATE, usados para criar estruturas gerais
(banco, tabelas, stored procedures e triggers), praticamente qualquer comando SQL pode ser utilizado em
uma Stored Procedure.

Exemplos de ALGUNS comandos NÃO PERMITIDOS em Stored Procedure:


 Create Database
 Create Table
 Create Procedure
 Create Trigger
 Create View
 Etc.

Uma Stored Procedure pode ser criada através de linhas de comandos ou com o auxílio de assistentes
do SQL Server.

15.1 – CRIAÇÃO DE STORED PROCEDURE COM O OBJECT EXPLORER

Para criar uma Stored Procedure usando o assistente, siga os seguintes passos:

1) Abra a árvore de objetos do banco de dados onde você deseja criara Stored Procedure. POR
EXEMPLO:

2) Abra o objeto “Programmability” e em seguida clique com o botão direito do mouse sobre o objeto
“Stored Procedure”, conforme figura abaixo:

Figura 53

3) Clique na opção “New Stored Procedure...” mostrada na figura acima. Surgirá então a seguinte
área para criação da Stored Procedure:

Professor: Alberson Wander Página: 55


Banco de Dados UNIVAP - CTI

Figura 54

4) Na janela mostrada, você deverá substituir o trecho de programa destacado em azul, na figura
acima, pelos comandos da sua Stored Procedure..Por exemplo, vamos escrever neste local uma
programação para criar uma Stored Procedure que mostrará todos os dados de professores
cadastrados na tabela professores, no banco de dados em questão. Após a digitação do novo

trecho pressione o botão , veja abaixo

Figura 55

Professor: Alberson Wander Página: 56


Banco de Dados UNIVAP - CTI

No exemplo, perceba que ao clicar no botão , a mensagem “Command(s) completed


successfully”, indicando que a Stored Procedure “Mostraprofessores” foi criada no banco de dados UNIVAP.

IMPORTANTE: REPARE QUE FORAM APAGADOS VÁRIOS TRECHOS DO PROGRAMA INCIAL,


PROPOSTO PELO SQL QUANDO A JANELA DO ASSITENTE FOI ABERTA. AQUELE TRECHO
DEMONSTRA A SINTAXE DE VÁRIOS COMANDOS QUE NORMALMENTE PODEM SER UTILIZADOS.
VEREMOS ADIANTE ESTES TRECHOS.

15.2 – ALTERANDO UMA STORED PROCEDURE COM O OBJECT EXPLORER

Estando criada a Stored Procedure, você poderá alterá-la, incluindo e/ou adicionando novos
comandos. Para isso basta seguir os seguintes passos:
a. Abra na árvore de objetos do SQL a área de Strored Procedure;
b. Clique com o botão direito do mouse sobre a Stored Procedure que deseja alterar, como
exemplo, vamos alterar a stored procedure “mostraprofessores”, no banco de dados UNIVAP;
c. No submenu que aparecerá, clique na opção “Modify”;

Veja EXEMPLO abaixo:

Figura 56

Aparecerá na tela a Stored Procedure indicada para alteração, veja abaixo:

Figura 57

Professor: Alberson Wander Página: 57


Banco de Dados UNIVAP - CTI

15.3 – EXCLUINDO UMA STORED PROCEDURE USANDO O OBJECT EXPLORER

Para excluir uma stored procedure criada, basta:


a) Abrir a árvore do banco de dados onde se encontra a Stored Procedure;
b) Abrir o objeto “Stored Procedure”, do banco aberto;
c) Quando aparecerem os nomes das procedures, na janela OBJECT EXPLORER, clique com o
botão direito do mouse sobre o nome da stored que deseja excluir.
d) No menu pop-up que irá surgir, clique em “Delete”.

Veja a figura abaixo, ela ilustra os passos descritos acima:

Figura 58

e) Surgirá então à janela “Delete Object” contendo o nome da procedure que foi selecionada para
exclusão. Por fim, clique no botão “OK”.

Veja exemplo a seguir:

Figura 59

Professor: Alberson Wander Página: 58


Banco de Dados UNIVAP - CTI

15.4 – EXECUTANDO UMA STORED PROCEDURE

QUALQUER Stored Procedure criada pode ser executada a qualquer momento. Para isso basta:

a) Clique no botão ;
b) Indique na barra de ferramentas qual o nome do banco de dados que deve estar ativo, no nosso

caso: ;
c) Estando com a área de digitação de instruções SQL aberta, escreva o nome da Stored Procedure.
No nosso exemplo digitaremos “mostraprofessores” .
d) Por fim, basta pressionar o botão .

No exemplo abaixo, será executada a Stored Procedure “mostraprofessores”, veja:

Figura 60

Veja que o resultado da execução dos comandos escritos na Stored Procedure “mostraprofessores”,
fez com que fosse exibido o painel de resultado, exibindo os registros filtrados.

15.5 – CRIAÇÃO DE STORED PROCEDURE (SEM PASSAGEM DE PARÂMETROS) USANDO O BOTÃO


“New Query” E PROGRAMAÇÃO

IMPORTANTE: Antes de criar uma stored procedure, tome cuidado de verificar qual o banco de dados
está aberto na barra de ferramentas:

Figura 61

Professor: Alberson Wander Página: 59


Banco de Dados UNIVAP - CTI

Para criarmos uma stored procedure com botão “New Query” (através de linha de comando), teremos
que usar a seguinte sintaxe:

Create Procedure <nome_procedure>


AS
<instruções SQL>

Veja abaixo um exemplo de criação de uma stored procedure através de linha de comandos:

Figura 62

A figura acima, ilustra os passos a seguir:


1) Selecione o nome do banco de dados onde você deseja criar a Stored Procedure, neste caso foi
“UNIVAP”;
2) Após a digitação da rotina que cria a stored procedure “alunoscadastrados” você deve clicar no
botão , ou então pressionar F5. Se a mensagem “Command(s) completed successfully”
aparecer, significará que a rotina foi criada com sucesso, no banco de dados “UNIVAP”.

Digitando o trecho de programação anterior, você criará a stored. Para executá-la, basta seguir os passos
descritos no item 15.4 desta apostila, ou seja, escrever o nome da procedure e pressionar novamente o
botão , conforme mostrado na figura abaixo:

Professor: Alberson Wander Página: 60


Banco de Dados UNIVAP - CTI

Figura 63

15.6 – ALTERAÇÃO DE STORED PROCEDURE (SEM PASSAGEM DE PARÂMETROS) USANDO O


BOTÃO “New Query” E PROGRAMAÇÃO

Para alterarmos a programação de uma stored procedure, poderemos usar o comando Alter
Procedure, conforme sintaxe abaixo:

ALTER PROCEDURE <nome_procedure_existente>


AS
<novas_instruções_SQL>

Vamos alterar a programação da stored procedure criada no item 15.5 desta apostila. Veja exemplo
abaixo:

Figura 64

Professor: Alberson Wander Página: 61


Banco de Dados UNIVAP - CTI

IMPORTANTE: após a digitação dos comandos SQL, que serão usados para substituir o código antigo,
torna-se necessário pressionar o botão para que a alteração seja realizada efetivamente. Para
testar a alteração feita, use novamente os passos do item 15.4 desta apostila.

15.7 – CRIAÇÃO DE STORED PROCEDURE (COM PASSAGEM DE PARÂMETROS) USANDO O BOTÃO


“New Query” E PROGRAMAÇAO

Muitas vezes torna-se necessário a passagem de parâmetros para uma procedure. O parâmetro
recebido é usado na instrução SQL, escrita no interior da stored procedure.

Sintaxe:
Create procedure <nome_procedure>
@<variável_1> <tipo_variável> , @<variável_2> <tipo_variável>, ........... , @<variável_N>
<tipo_variável>
AS
<instrução_SQL_usando_variáveis declaradas>

IMPORTANTE: OS NOMES DE VARIÁVEIS, QUE RECEBERÃO OS PARÂMETROS, DEVEM SER


PRECEDIDOS PELO CARACTERE “@”, CONFOME MOSTRADO NA SINTAXE ACIMA.

Vejamos exemplo de criação de procedure com área de parâmetros:

Figura 65

15.8 – EXECUTANDO UMA STORED PROCEDURE (COM PASSAGEM DE PARÂMETROS)

Para testarmos uma stored procedure com passagem de parâmetros, temos que saber quais são os
parâmetros requisitados pela rotina.

Para exemplificar melhor, vamos executar a rotina criada no item 15.7 desta apostila. Veja como
devemos testá-la:

Professor: Alberson Wander Página: 62


Banco de Dados UNIVAP - CTI

Figura 66

IMPORTANTE RESSALTAR:
a) “MOSTRARALUNO” é o nome da stored procedure criada anteriormente;
b) O número 1, digitado na frente do nome da procedure, será passado para a variável @ID;
c) Neste caso, então, serão exibidos os registros de clientes cujo conteúdo do campo ALUNO_ID seja
igual a 1. A figura acima mostra o resultado da execução da stored procedure.

15.9 – ALTERANDO UMA STORED PROCEDURE (COM PASSAGEM DE PARÂMETROS) COM O BOTÃO
“New Query” E PROGRAMAÇÃO

Para alterar uma stored procedure que possua área de parâmetros, você deve usar a sintaxe indicada
no item 15.6 desta apostila.

Vale dizer que, se desejar, você pode reescrever a procedure com ou sem passagem de parâmetros.
Diante disso, será necessário alterar a instrução SQL escrita na rotina. Vejamos um exemplo:

Figura 67

Professor: Alberson Wander Página: 63


Banco de Dados UNIVAP - CTI

Neste exemplo, repare que a rotina foi alterada, de tal forma que receberá DOIS PARÂMETROS
quando for chamada. Portanto, quando for executar a rotina “MOSTRARALUNO”, devemos indicar o valor
inicial e final referente ao Aluno_ID, ou seja, estamos pesquisando por alunos cujo conteúdo do campo
ALUNO_ID esteja entre valores informados quando a stored procedure é chamada para execução.

15.10 – CRIANDO UMA STORED PROCEDURE COM PASSAGEM DE PARÂMETROS E COM VALORES
PADRÕES

Caso tentássemos executar uma stored procedure sem informar um parâmetro, requisitado pela
mesma, seria mostrada a seguinte mensagem de erro:

Figura 68

Veja que quando a procedure “mostraraluno” foi alterada, foram criadas DUAS variáveis que receberão
parâmetros informados pelo usuário, no momento da chamada mesma. Perceba que foi digitado somente o
nome da rotina e um dos valores obrigatórios como parâmetro e que não foi indicado o segundo valor de
parâmetro para consulta. Com isso foi exibida a mensagem de erro, informando o usuário que a rotina exige
outro parâmetro de entrada.

Para evitarmos esse tipo de erro, podemos definir valores padrões para as variáveis que receberão os
parâmetros de entrada.

Vamos reescrever a rotina de programação “mostraraluno” de tal forma que, se o @ID_INICIAL ou


@ID_FINAL forem omitidos, no momento da chamada da mesma, não deverá ocorrer erro, mas, deverá
sempre ser mostrado dados do aluno entre valores definidos como parâmetro, vejamos:

Figura 69

Professor: Alberson Wander Página: 64


Banco de Dados UNIVAP - CTI

Para resolvermos o problema, no momento da criação da variável devemos indicar um valor padrão, ou
seja, um valor que será atribuído à variável somente se a mesma não receber valores indicados pelo usuário,
no momento da chamada da rotina.

Vamos testar a nova rotina digitando somente o nome da mesma, sem passar nenhum parâmetro,
veja:

Figura 70

Pelo fato de não ter sido passado o parâmetro referente o @ID_FINAL, o SQL-Server atribuiu a
variável @ID_INICIAL o número 2, digitado pelo usuário. Como o usuário não informou um valor para o
@ID_FINAL, foi atribuído automaticamente para esta variável o valor 100. Portanto a instrução mostrou dados
de alunos cujo campo ALUNO_ID esteja entre 2 e 100(definido como padrão)

15.11 – EXCLUINDO UMA STORED PROCEDURE COM O BOTÃO “New Query” E PROGRAMAÇÃO

Para excluir uma strored procedure, basta usar a seguinte sintaxe:

Drop procedure <nome_procedure>

Veja o exemplo a seguir:

Figura 71

Professor: Alberson Wander Página: 65


Banco de Dados UNIVAP - CTI

No exemplo mostrado, após digitar a linha de comando “drop procedure mostraraluno”, foi pressionado
o botão . Isso fez com que fosse excluída a procedure “mostraraluno”, do banco de dados UNIVAP.

16 –TRIGGER

São rotinas de programação que são disparadas automaticamente, diante das seguintes operações
realizadas com tabelas:
• INCLUSÃO DE REGISTRO
• ALTERAÇÃO(ÕES) DE REGISTRO(S)
• EXCLUSÃO(ÕES) DE REGISTRO(S)

Estas rotinas são pré-programadas pelo administrador do banco de dados.

Geralmente os sistemas desenvolvidos pelos programadores em linguagens tais como: Visual Basic,
Delphi e etc, são responsáveis pelo gerenciamento de todas as regras de negócio do referido sistema. Por
exemplo, o sistema que dá baixa automaticamente de produtos do estoque. A principal aplicação de uma
TRIGGER é cuidar destas regras de negócio, sem que seja necessário um programa qualquer para fazê-lo.

16.1 – CRIANDO / ALTERANDO / EXCLUINDO TRIGGER

Para criarmos TRIGGER, usamos a seguinte sintaxe:

Sintaxe:
CREATE TRIGGER [NOME_TRIGGER] ON [TABELA]
FOR <INSERT, DELETE, UPDATE>
AS
<instruções_sql>

Para alterarmos uma TRIGGER, usamos a seguinte sintaxe:

Sintaxe:
ALTER TRIGGER [NOME_TRIGGER] ON [TABELA]
FOR <INSERT, DELETE, UPDATE>
AS
<instruções_sql>

Nas sintaxes acima, existe a cláusula “FOR”. Esta cláusula refere-se ao momento quando a trigger
será disparada, por exemplo: Se na frente da cláusula “FOR” estiver definida a palavra INSERT, significa que a
trigger será disparada quando ocorrer um cadastro na tabela definida na cláusula “[TABELA]”. Quando
queremos que uma trigger seja disparada ao excluir um registro, devemos indicar na frente da cláusula “FOR”
a palavra DELETE. Para disparar uma trigger quando uma alteração for efetuada em um registro qualquer,
basta indicar a palavra UPDATE na frente da cláusula “FOR”. Se necessário for, podemos indicar que a trigger
será executada quando ocorrer cadastro, alteração ou exclusão escrevendo INSERT, DELETE, UPDATE na
frente da cláusula “FOR”.

Para excluirmos uma TRIGGER, usamos a seguinte sintaxe:

Sintaxe:
DROP TRIGGER [NOME_TRIGGER]

Vejamos alguns exemplos:

Professor: Alberson Wander Página: 66


Banco de Dados UNIVAP - CTI

Vamos imaginar as seguinte tabelas relacionadas de um banco de dados:

Figura 72

Vamos criar uma TRIGGER no SQL-SERVER,siga os passos abaixo:

1) Clique no botão ;
2) Digite a seguinte programação na área de edição de comandos:

Figura 73

3) Em seguida, pressione o botão ;


4) Se tudo estiver certo, será mostrada a seguinte mensagem:

Figura 74

A TRIGGER CRIADA ACIMA,COMO EXEMPLO, será disparada automaticamente sempre que um


registro novo for cadastrado na tabela venda.

16.2 – TESTANDO O FUNCIONAMENTO DE UMA TRIGGER

Para testar o funcionamento de uma trigger, basta realizar uma operação (cadastro, alteração ou
exclusão, dependendo do que foi definido na cláusula “FOR”) na tabela definida na cláusula “[TABELA]”
quando a TRIGGER foi criada.

Professor: Alberson Wander Página: 67


Banco de Dados UNIVAP - CTI

Como exemplo, vamos testar a trigger “VENDI”, criada como exemplo no item 16.1 desta apostila. Para
isso, basta cadastrar um registro. Usando o botão “New Query” vamos escrever uma linha de comando
INSERT, como o exemplo ilustrado a seguir:

Figura 75

Veja o que aconteceu:

Quando o comando INSERT foi executado, a TRIGGER “vendi” foi disparada automaticamente,
exibindo no painel de resultados todos os dados cadastrados na tabela “VENDA”.

16.3 – AS TABELAS TEMPORÁRIAS INSERTED E DELETED

As tabelas INSERTED e DELETED são criadas automaticamente na memória do computador somente


no momento em que as trigger´s estão sendo executadas.

Após a execução das trigger´s, as tabelas INSERTED e DELETED são excluídas da memória do
computador.

Vale dizer que a tabela INSERTED é criada quando a(S) operação(ões) INSERT ou UPDATE são
executadas. Já a tabela DELETED é criada quando a operação DELETE é executada.

Estas tabelas armazenam exatamente os registros que foram incluídos, alterados e/ou excluídos. É
importante lembrar que na tabela INSERTED, quando for criada pela operação INSERT, armazenará somente
um registro que acabou de ser cadastrado. Quando um grupo de registro for alterado, ESTES REGISTROS
serão armazenados na tabela INSERTED. Quando um grupo de registro for excluído, ESTES REGISTROS
serão armazenados temporariamente na tabela DELETED.

Para exemplificar melhor vamos fazer o seguinte:

a) Vamos criar uma trigger para puxar automaticamente o preço do produto vendido, e calcular
automaticamente o subtotal da venda, ou seja, o usuário não informará o valor do produto nem o
subtotal, quando efetuar o cadastro na tabela “VENDA”.

b) Em seguida, vamos cadastrar um registro na tabela VENDA, contendo somente as seguintes


informações:

Professor: Alberson Wander Página: 68


Banco de Dados UNIVAP - CTI

• número da venda,
• código do produto,
• código do cliente
• e quantidade vendida do produto

Vamos ilustrar tudo que foi descrito anteriormente. Primeiramente vamos criar a trigger, conforme
exemplo abaixo:

Figura 76

Agora vamos testar a trigger, cadastrando um registro na tabela venda:

Figura 77

Repare que no exemplo acima, duas tabelas foram exibidas no painel de resultados. Isso aconteceu,
porque existiam, neste caso, DUAS TRIGGER´S ligadas à tabela VENDA, a saber: “VENDI” (criada no exemplo

Professor: Alberson Wander Página: 69


Banco de Dados UNIVAP - CTI

do item 16.1 desta apostila) e “CALCULASUBOTAL”. Portanto, saiba que podemos ter várias trigger´s criadas
e ligadas a uma tabela.

Veja que a segunda tabela exibida atualizou o VALORPROD e calculou o SUBTOTAL, de acordo com
os comandos SQL descritos na trigger. Esta tabela foi mostrada/gerada pela trigger que acabamos de criar
(CALCULASUBTOTAL).

Como você deve ter percebido, nos comandos SQL criados na trigger, referenciamos a tabela
INSERTED, isto porque ela armazena uma cópia exata do registro que acabou de ser cadastrado.

COMO OS VALORES DOS CAMPOS VALOR PROD E SUBTOTAL FORAM GRAVADOS, VISTO
QUE NÃO OS INFORMAMOS NO MOMENTO DO CADASTRO?

R. A resposta é simples. O primeiro comando UPDATE, escrito na trigger, buscou o código do


produto que acabou de ser cadastrado, e que estava armazenado TEMPORARIAMENTE na tabela
INSERTED. Conhecido o código do produto, buscou-se o VALORPROD do mesmo, na tabela PRODUTO. Por
fim, na cláusula WHERE foram definidos os critérios para atualização do registro da tabela “VENDA”, ou seja,
somente será atualizado o valor do produto, do registro de VENDA, cujo CODP e NVENDA (ambos da tabela
VENDA) sejam iguais aos codp e nvenda armazenados na tabela INSERTED, sendo assim informou-se que
seria atualizado o registro da venda que acabou de ser cadastrado.
O segundo comando UPDATE, escrito na trigger, é responsável por atualizar o campo SUBOTOTAL do
registro que acabou de ser cadastrado na tabela VENDA. Para isso, multiplicou-se a quantidade informada pelo
usuário, no momento do cadastro (INSERT), pelo VALORPROD atualizado pelo primeiro comando UPDATE,
gerando assim, o SUBTOTAL. Como critério, foi informado na cláusula WHERE, que somente será atualizado
o SUBOTOTAL do registro de VENDA cujo codp e nvenda fossem iguais aos armazenados na tabela
INSERTED, ou seja, da venda que acabou de ser cadastrada.
O comando SELECT, escrito na trigger, é responsável pela exibição do registro contendo o VALORPROD e
SUBTOTAL. Perceba também, que na cláusula WHERE, foi estabelecido o mesmo critério dos comandos
UPDATE, descritos anteriormente, ou seja, filtrar somente o registro da venda que acabou de ser cadastrado.

Professor: Alberson Wander Página: 70