Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
FALS
Apostila – Parte 1
Página 1 de 39
FALS – BANCO DE DADOS 1
Página 2 de 39
FALS – BANCO DE DADOS 1
Note que cada linha representa um elemento do conjunto dos funcionários da empresa e
cada coluna, uma dada informação a respeito dos funcionários. Desta forma, cada célula
da tabela armazena um dado referente a um funcionário específico. Maria tem 45 anos
de idade.
Página 3 de 39
FALS – BANCO DE DADOS 1
Apresentamos a seguir o comando SQL utilizado para criar a tabela que armazena dados
sobre os clientes de uma empresa.
No comando acima, definiu-se o nome da tabela como “dbo.tbcliente”. Para cada coluna
é necessário especificar seu nome, seu tipo (domínio) e se será ou não permitido o valor
nulo (NULL).
Página 4 de 39
FALS – BANCO DE DADOS 1
Quando um nome parcial é utilizado, o sistema completa as partes faltantes com base no
contexto em que o comando está sendo executado. Por exemplo, se for utilizado o nome
parcial table_name, o sistema utilizará para completar o nome do objeto o nome do
servidor onde se está executando o comando, o nome do database corrente e o nome da
conta do usuário que esta executando o comando.
Página 5 de 39
FALS – BANCO DE DADOS 1
Atribuindo valores para todos as colunas da tabela, na ordem em que foram definidas
pelo comando CREATE TABLE
insert tbcliente
values (100,'Ana','11/20/2001','RS','1234-5678',2000.20,0)
insert tbcliente
values (110,'Joao','03/05/1999','SC',null,120.33,0)
insert tbcliente
(NomeCliente,DataCadastro,Estado,CodCliente,MediaCompra,FisJur)
values ('JRS' , '08/17/1987' , 'PR' , 130, 1000000.19 , 1)
Página 6 de 39
FALS – BANCO DE DADOS 1
O número 2 específica que a classificação deve ser feita pela segunda coluna ou seja
MediaCompra. Poderíamos ter escrito “order by MediaCompra desc”, o resultado seria
o mesmo.
TOP 3 especifica que apenas as três primeiras linhas do resultado serão apresentadas.
Selecionando linhas.
Listar, em ordem decrescente por Estado e Nome do cliente, apenas as pessoas físicas.
select NomeCliente as Nome_Cliente,
MediaCompra as [Media Compra Mensal],
[Data Cadastro] = DataCadastro,
Estado
from tbcliente
where FisJur=0
order by 4,NomeCliente desc
Página 7 de 39
FALS – BANCO DE DADOS 1
3. Exclusão de Linhas
Excluir todas as linhas de uma tabela. Exclui apenas o conteúdo, a tabela continua
existindo no database, vazia.
delete tbcliente
Outra forma.
truncate table tbcliente
O cliente RGB mudou-se para o RS e sua média de compras passou de R$481,45 para
R$356,34.
update tbcliente
set estado='RS', MediaCompra=356.34
where codcliente=120
Se você não colocar a cláusula WHERE, todas as linhas da tabela terão os valores das
colunas Estado e MediaCompra alterados. CUIDADO.
Página 8 de 39
FALS – BANCO DE DADOS 1
Página 9 de 39
FALS – BANCO DE DADOS 1
Página 10 de 39
FALS – BANCO DE DADOS 1
Exercício
Crie a tabela descrita abaixo, para armazenamento de dados sobre veículos à venda em
uma agência de automóveis, utilizando sempre o tipo mais adequado. Treine na tabela
criada os comando INSERT, SELECT, DELETE e UPDATE.
São tipos de dados definidos pelos usuários (desenvolvedores) com base nos tipos
fornecidos pelo sistema.
A criação e a exclusão de tipos definidos pelo usuário são executadas através de System
Stored Procedure: programas definidos pelo sistema. Futuramente veremos quais são as
procedures mais utilizadas e como criar nossas próprias. Os nomes de todas as System
Stored Procedures começam com SP_.
Se você necessitar visualizar a estrutura de uma tabela, isto é, quais são suas colunas e
respectivos tipos e propriedades (você perdeu o arquivo onde estava o comando Create
Table), utilize a System Stored Procedure SP_HELP, da seguinte forma.
Página 11 de 39
FALS – BANCO DE DADOS 1
A procedure SP_HELP também pode ser utilizada para visualizar informações sobre
tipos de dados criados pelo usuário, por exemplo:
Observação: Se a tabela contiver dados, só será possível incluir uma coluna com o
atributo NULL; a menos que a definição da coluna possua uma constraint DEFAULT (
veremos constraints a seguir).
Importante:
· Só pode haver uma coluna IDENTITY por tabela;
· Não pode ser atualizada;
· Não permite NULL.
Página 12 de 39
FALS – BANCO DE DADOS 1
O exemplo acima cria uma tabela de nome TBPRODUTO. O valor para a coluna
IDPRODUTO (número interno de identificação de um produto vendido pela
companhia) é gerado automaticamente pelo sistema quando uma linha (produto) é
inserida na tabela.
Observe que a coluna IDPRODUTO não foi referenciada (nem pode) no comando
INSERT. Crie esta tabela, insira linhas e visualize, com o comando SELECT, os valores
gerados pelo sistema para a coluna IDPRODUTO.
V. Integridade de Dados
A integridade dos dados armazenados no database é conseguida definindo-se restrições:
a) Sobre o conjunto de valores válidos para as colunas de uma tabela, por exemplo,
a coluna ESTADO da tabela TBCLIENTE, do exemplo utilizado anteriormente,
de acordo com sua definição, só deve aceitar RS, SC e PR, como valores
válidos;
b) Sobre a relação entre os valores de duas ou mais colunas de uma tabela, por
exemplo, suponha a tabela ALUNO de um database de uma escola, com duas
colunas tipo data: DATA_INICIO_CURSO e DATA_FORMATURA,
obviamente, DATA_FORMATURA deve ser posterior (>=) a
DATA_INICIO_CURSO;
c) Que impeçam a duplicação indevida de linhas em tabelas;
d) Que mantenham a consistência referencial entre duas ou mais tabelas, por
exemplo, suponha um database com dados sobre os funcionários de uma
empresa e seus dependentes (esposa, filhos, etc), suponha ainda que, por
motivos que veremos a seguir, sejam criadas duas tabelas: TBFUNCIONARIO e
TBDEPENDENTE, a restrição em que “todo dependente deve estar associado a
pelo menos um funcionário” deve ser atendida, de forma a não termos linhas
“órfãs” em TBDEPENDENTE (inconsistência).
No SQL Server 7.0, os quatro tipos de restrição descritos acima podem ser
implementados através de CONSTRAINTS ou programas (TRIGGERS e STORED
PROCEDURES). Por enquanto veremos apenas as CONSTRAINTS
Página 13 de 39
FALS – BANCO DE DADOS 1
A. CHECK
Se você executar o seguinte comando, obterá uma mensagem de erro, pois SP não é um
valor válido para a coluna ESTADO.
insert tbcliente
values (100,'Ana','11/20/2001','SP','1234-5678',2000.20,0)
Página 14 de 39
FALS – BANCO DE DADOS 1
Exercício:
Utilize a system stored procedure SP_HELP, para obter a listagem descrevendo
a estrutura (definição) da tabela TBCLIENTE e localize na mesma a constraint
check criada e sua definição.
Obs: Vale ressaltar que o tipo de dado selecionado para uma coluna assim como o
atributo NULL (ou NOT NULL) também impõem integridade a coluna. Campos
numéricos, por exemplo, não aceitam, obviamente, valores não numéricos, sendo,
portanto, impossível ter-se uma coluna INT com o valor 15X.34 . Em sistemas mais
antigos, era comum (não muito) encontrar datas armazenadas em campos caracteres
(CHAR), como campos caracteres aceitam tudo, datas como 31/02/2002, por exemplo,
eram encontradas. A utilização de tipos de dados apropriados para armazenamento de
datas garantem que apenas datas válidas serão aceitas. Como último exemplo, considere
o absurdo de se ter uma linha na tabela TBCLIENTE sem valor na coluna
NOMECLIENTE, caso esta coluna tivesse sido definida como não obrigatória (NULL).
Exercício:
Defina uma constraint check que restrinja a coluna FISJUR aos valores 0
(pessoa física) e 1 (pessoa jurídica), conforme definição.
B. DEFAULT
Página 15 de 39
FALS – BANCO DE DADOS 1
Exercício:
Modifique o comando CREATE TABLE acima definindo ‘RS’
como valor padrão para a coluna ESTADO.
C. PRIMARY KEY
Uma coluna ou combinação de colunas que identifiquem exclusivamente uma linha das
demais linhas de uma tabela é chamada de chave da tabela (Key).
Uma tabela pode ter várias chaves. Uma delas pode ser escolhida como principal
(Primary).
Exemplos de chaves:
a) O número de matrícula de um aluno da FALS identifica exclusivamente o aluno.
Ou seja, não existem dois alunos com a mesma matrícula.
b) O CPF identifica exclusivamente uma pessoa física perante a receita federal.
Para uma tabela projetada para armazenar dados sobre os alunos da FALS, por exemplo,
precisamos garantir que um mesmo número de matrícula não seja utilizado, por engano,
para dois ou mais alunos.
Obs: Todas as colunas que compõem a PRIMARY KEY devem ter o atributo NOT
NULL.
Página 16 de 39
FALS – BANCO DE DADOS 1
Mensagem de erro:
Server: Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK__tbcliente__117F9D94'. Cannot insert
duplicate key in object 'tbcliente'.
The statement has been terminated.
No exemplo abaixo, ilustramos a criação de uma chave primária composta por duas
colunas.
O sistema garantirá que não existirão duas linhas com a mesma combinação de valores
nas duas colunas, ou seja, um mesmo cliente (CODCLIENTE) pode aparecer em várias
linhas da tabela desde que em cada uma delas DATAPEDIDO seja diferente. Não será
possível, portanto, serem inseridas duas linhas com CODCLIENTE = 100 e
DATAPEDIDO=’01/01/2003’, por exemplo.
Página 17 de 39
FALS – BANCO DE DADOS 1
D. UNIQUE
Se você precisar garantir também a integridade da tabela por outras chaves além da
primária, utilize a constraint UNIQUE. A constraint UNIQUE garantirá que valores
duplicados não serão inseridos na tabela.
E. REVISÃO 1
O exercício a seguir visa o treinamento sobre os conceitos e comandos da linguagem
SQL (Transact-SQL) vistos até agora. O exemplo utilizado tem caráter didático, não
sendo a melhor solução a ser adotada para o cadastramento de dados sobre
eletrodomésticos. Futuramente, veremos soluções melhores.
Enunciado:
1. Crie a tabela ELETRODOMESTICOS conforme descrição abaixo, selecionando
o tipo de dado mais adequado e implemente restrições que impeçam que valores
inválidos sejam entrados.
2. Defina e implemente a chave primária para esta tabela.
Página 18 de 39
FALS – BANCO DE DADOS 1
F. FOREIGN KEY
Tomemos a coluna Fabricante. Uma das formas possíveis para restringirmos os valores
entrados nesta coluna (os válidos são: 1,2 ou 3) é utilizarmos uma constraint CHECK,
como a seguir:
O grande inconveniente é termos que alterar a estrutura da tabela sempre que passarmos
a trabalhar com produtos de outro fabricante. Neste caso, um novo código (4) referente
ao novo fabricante (Eletrolux, por exemplo) passa a ser válido para a coluna. Para tal, é
necessário alterar a constraint CHECK, excluindo-a e recriando-a através do comando
ALTER TABLE.
Exclui CHECK
Página 19 de 39
FALS – BANCO DE DADOS 1
Recria CHECK
Com esta solução, basta incluir um novo fabricante na tabela TBFABRICANTE para
que o mesmo (seu identificador – IdFabricante) passe a ser aceito como valor válido
para a coluna Fabricante da tabela ELETRODOMÉSTICOS.
Para nossa sorte, através da constraint FOREIGN KEY (chave estrangeira), o próprio
sistema executa este tipo de validação.
Para substituir a constraint CHECK pela FOREIGN KEY, podemos fazer o seguinte:
Exclui CHECK
Óbvio que a tabela TBFABRICANTE deve ser criada antes que o comando acima seja
executado.
Página 20 de 39
FALS – BANCO DE DADOS 1
Constraints do tipo FOREIGN KEY e CHECK podem ser desabilitadas através dos
seguintes comandos:
Ou
Ou
Se for necessário criar uma constraint CHECK ou FOREIGN KEY em uma tabela
existente e com dados (ALTER TABLE), é padrão do sistema verificar se existe alguma
linha da tabela que viole a condição da constraint, se houver alguma, o comando é
cancelado. Em casos raros, podemos querer criar um destes tipos de constraints sem que
Página 21 de 39
FALS – BANCO DE DADOS 1
Como WITH CHECK, ou seja, com verificação, é o padrão; os dois comandos a seguir
são equivalentes.
Para que não seja feita a verificação das linhas existentes, utilizamos WITH
NOCHECK, da seguinte forma:
Funcionarios
NumeroFunc NomeFunc
1000 Paulo
1200 Joana
1530 Jose
(Primary Key)
Dependentes
NumeroFunc NomeDep
1530 Carla
1000 Renato
1530 Carlos
1530 Mario
(Foreign Key)
Página 22 de 39
FALS – BANCO DE DADOS 1
Resultado Desejado
Nome Funcionário Nome Dependente
Jose Carla
Jose Carlos
Jose Mario
Paulo Renato
1) SELECT *
FROM FUNCIONARIOS, DEPENDENTES
Página 23 de 39
FALS – BANCO DE DADOS 1
2) SELECT *
FROM FUNCIONARIOS, DEPENDENTES
WHERE FUNCIONARIOS.NUMEROFUNC =
DEPENDENTES.NUMEROFUNC
Note que é necessário preceder as colunas NUMEROFUNC com os nomes das tabelas a
que elas se referem. Para que a coluna NUMEROFUNC da tabela FUNCIONARIOS
não seja confundida com a coluna NUMEROFUNC da tabela DEPENDENTES.
B. USO DE APELIDO
Uma outra forma para o comando anterior que gera o mesmo resultado, mas simplifica a
escrita, utiliza um apelido para cada uma das tabelas.
3) SELECT *
FROM FUNCIONARIOS FU, DEPENDENTES DP
WHERE FU.NUMEROFUNC = DP.NUMEROFUNC
Neste comando, sempre que a tabela FUNCIONARIOS precisa ser referenciada, utiliza-
se seu apelido FU, reduzindo a escrita. Utilizamos duas letras para o apelido, mas
poderiam ser 1, 3, 5 ou mais.
C. INNER JOIN
Uma 3ª forma para o comando que também produz o mesmo resultado é a seguinte.
4) SELECT *
FROM FUNCIONARIOS FU INNER JOIN DEPENDENTES DP
ON FU.NUMEROFUNC = DP.NUMEROFUNC
Note que o critério para filtrar apenas as linhas desejadas, passa a ser especificado junto
ao ON, não mais no WHERE.
Isto não significa que a cláusula WHERE, não possa ser utilizada. No exemplo abaixo,
utilizamos WHERE para selecionar apenas as linhas cuja idade do dependente seja
superior a 10 anos (suponha que o campo IDADE, tenha sido acrescentado à tabela
DEPENDENTES),
5) SELECT *
FROM FUNCIONARIOS FU INNER JOIN DEPENDENTES DP
ON FU.NUMEROFUNC = DP.NUMEROFUNC
WHERE IDADE > 10
Note que não é preciso escrever DP.IDADE, pois não há em FUNCIONARIOS uma
coluna de nome IDADE, ou seja, não há dúvida de que IDADE, refere-se a uma coluna
de dependente. Não há ambigüidade.
Página 24 de 39
FALS – BANCO DE DADOS 1
D. LEFT JOIN
Note que nos resultados obtidos anteriormente, foram listados apenas funcionários que
possuíam pelo menos 1 dependente. Funcionários sem dependentes nunca aparecem.
Se quisermos forçar que todos os funcionários sejam apresentados pelo menos uma vez
no resultado, independentemente se eles tem ou não dependentes, precisamos reescrever
e consultar (4) substituindo INNER JOIN por LEFT JOIN, como segue:
6) SELECT *
FROM FUNCIONARIOS FU LEFT JOIN DEPENDENTES DP
ON FU.NUMEROFUNC = DP.NUMEROFUNC
(5 row(s) affected)
Para os funcionários sem dependentes, ou seja, que não atendam ao critério do JOIN
(que segue a cláusula ON), tem-se nas colunas referentes à tabela DEPENDENTES
valores NULL, como é o caso de JOANA, no exemplo.
E. RIGHT JOIN
Na consulta anterior (6) utilizamos LEFT JOIN porque a tabela FUNCIONARIOS, para
a qual queremos que todas as suas linhas sejam apresentadas ao menos uma vez no
resultado, encontra-se à esquerda do JOIN.
7) SELECT *
FROM FUNCIONARIOS FU RIGHT JOIN DEPENDENTES DP
ON FU.NUMEROFUNC = DP.NUMEROFUNC
Note que a consulta abaixo produz exatamente o mesmo resultado consulta (6), a menos
da ordem das colunas.
8) SELECT *
FROM DEPENDENTES DP RIGHT JOIN FUNCIONARIOS FU
ON FU.NUMEROFUNC = DP.NUMEROFUNC
Página 25 de 39
FALS – BANCO DE DADOS 1
(5 row(s) affected)
LEFT JOIN (ou RIGHT JOIN) podem ser utilizados para solucionar a seguinte questão:
“Quais são os funcionários que não possuem dependentes?”. No exemplo, JOANA.
9) SELECT *
FROM FUNCIONARIOS FU LEFT JOIN DEPENDENTES DP
ON FU.NUMEROFUNC = DP.NUMEROFUNC
WHERE DP.NUMEROFUNC IS NULL
Para tanto, basta utilizar o fato de que, utilizando LEFT JOIN como acima, todo
funcionário sem dependente aparece 1 vez no resultado e tem valores NULL em todas
as colunas referentes à tabela DEPENDENTES. Utilizando a cláusula WHERE
selecionamos (filtramos) apenas as linhas de interesse.
(1 row(s) affected)
Em algumas situações uma tabela pode ser unida (JOIN) a ela mesma, principalmente
quando há auto-relacionamento. Por exemplo, suponha que a coluna
SUBORDINADO_A seja adicionada a tabela FUNCIONARIOS, como segue:
Funcionarios
NumeroFunc NomeFunc Subordinado_A
1000 Paulo 1530
1200 Joana NULL
1530 Jose 1200
(Primary Key)
Página 26 de 39
FALS – BANCO DE DADOS 1
Suponha que seja solicitado o relatório: “Liste os chefes e seus subordinados diretos”,
como segue.
CHEFE SUBORDINADO
Joana José
José Paulo
G. SUBQUERY
É possível na linguagem SQL construir comandos SELECT que tenham em seu corpo
outros SELECTs aninhados. Os SELECTs internos são denominados SUBQUERYs.
11) SELECT *
FROM FUNCIONARIOS
WHERE NUMEROFUNC NOT IN
(SELECT NUMEROFUNC FROM DEPENDENTES)
Note que a subquery gera como resultado, se executada isoladamente, todos os valores
da coluna NUMEROFUNC de DEPENDENTES.
NUMEROFUNC
-----------
1530
1000
1530
1530
(4 row(s) affected)
12) SELECT *
FROM FUNCIONARIOS
WHERE NUMEROFUNC NOT IN (1530,1000,1530,1530)
Resumindo, a consulta (11) também lista todos os funcionários que não possuem
dependentes, ou seja, NUMEROFUNC não pertence (NOT IN) à lista
(1530,1000,1530,1530), gerada a partir da tabela DEPENDENTES.
Página 27 de 39
FALS – BANCO DE DADOS 1
H. EXISTS
13) SELECT *
FROM FUNCIONARIOS FU
WHERE NOT EXISTS
(SELECT * FROM DEPENDENT ES DP
WHERE FU. NUMEROFUNC=DP. NUMEROFUNC)
Funcionarios
NumeroFunc NomeFunc
1000 Paulo
1200 Joana
1530 Jose
(Primary Key)
Página 28 de 39
FALS – BANCO DE DADOS 1
A. EXEMPLOS
c) Supondo uma tabela com todas as vendas realizadas pela empresa (abaixo),
calcular o valor total em reais vendido no mês de janeiro/2003.
Página 29 de 39
FALS – BANCO DE DADOS 1
VENDAS
NumeroPedido Codigo_Vendedor Mes Valor_Venda
1001 20 01/2003 100
1002 10 02/2003 200
1003 10 12/2002 300
1004 10 02/2003 400
1005 20 12/2002 500
1006 20 01/2003 600
1007 10 01/2003 700
1008 20 12/2002 800
B. GROUP BY
Podemos melhorar o exemplo (C) acima (total vendas) para gerar o total de vendas em
todos os meses. Para isto utilizamos a cláusula GROUP BY, como segue.
A cláusula GROUP BY acima especifica que as linhas da tabela VENDAS devem ser
agrupadas pela coluna MES. Ou seja, todas as linhas com o mesmo valor em MES
pertencerão ao mesmo grupo.
Grupo 01/2003
NumeroPedido Codigo_Vendedor Mes Valor_Venda
1001 20 01/2003 100
1006 20 01/2003 600
1007 10 01/2003 700
Grupo 02/2003
NumeroPedido Codigo_Vendedor Mes Valor_Venda
1002 10 02/2003 200
1004 10 02/2003 400
Página 30 de 39
FALS – BANCO DE DADOS 1
Grupo 12/2002
NumeroPedido Codigo_Vendedor Mes Valor_Venda
1003 10 12/2002 300
1005 20 12/2002 500
1008 20 12/2002 800
Para cada grupo o comando SELECT gerará uma única linha, da seguinte forma:
§ A coluna MES terá o valor do mês a que se refere o grupo;
§ A coluna NUMERO_VENDAS terá o número de linha do grupo (COUNT(*))
§ A coluna TOTAL_VENDAS_MES terá a soma dos valores da coluna
VALOR_VENDA das linhas do grupo.
Exercício:
a) Escreva consulta que produza relatório de vendas agrupado por
CODIGO_VENDEDOR;
b) Escreva consulta que produza relatório de vendas agrupado por MÊS e
CODIGO_VENDEDOR;
C. HAVING
É possível ainda filtrar as linhas do resultado produzido pelo comando SELECT com
GROUP BY através da cláusula HAVING.
Página 31 de 39
FALS – BANCO DE DADOS 1
ETAPAS DO PROCESSAMENTO
Etapa 1 – Cláusula WHERE – vendas que não tenham sido realizadas em 2003 são
desconsideradas.
VENDAS
NumeroPedido Codigo_Vendedor Mes Valor_Venda
1001 20 01/2003 100
1002 10 02/2003 200
1004 10 02/2003 400
1006 20 01/2003 600
1007 10 01/2003 700
Etapa 2 – GROUP BY
Etapa 3 – HAVING
D. COMPUTE e COMPUTE BY
Importante salientar que as colunas para as quais serão gerados subtotais devem ser
obrigatoriamente classificadas (ordenadas) através da cláusula ORDER BY.
Página 32 de 39
FALS – BANCO DE DADOS 1
RESULTADO
cnt
==========
1
sum
===================
300.0000
cnt
==========
2
sum
===================
1300.0000
cnt
==========
1
sum
===================
700.0000
cnt
==========
2
sum
===================
700.0000
cnt
==========
2
sum
===================
600.0000
cnt
==========
8
Página 33 de 39
FALS – BANCO DE DADOS 1
sum
===================
3600.0000
Página 34 de 39
FALS – BANCO DE DADOS 1
FUNCIONARIOS
NumeroFunc NomeFunc DataNascimento
1000 Mariana 17/04/1987
1010 Ana 01/01/2000
1020 Maria 30/10/1964
1030 Jussara 17/04/1987
O comando:
DataNascimento
17/04/1987
01/01/2000
30/10/1964
17/04/1987
Já com o comando:
Temos:
DataNascimento
17/04/1987
01/01/2000
30/10/1964
Ou seja, com DISTINCT, não há repetição da data 17/04/1987, não há duas linhas
iguais no resultado produzido. Dizemos que este resultado é a projeção da tabela (ou
relação) Funcionários na coluna DataNascimento. A projeção pode ser feita sobre mais
de uma coluna. O resultado será uma tabela (relação) composta pelas colunas projetadas
e por linhas da tabela original, sem repetição nestas colunas.
Página 35 de 39
FALS – BANCO DE DADOS 1
B. Operador LIKE
Através do operador LIKE é possível fazer comparações entre expressões String (cadeia
de caracteres) com um padrão criado por caracteres normais e caracteres curingas.
Página 36 de 39
FALS – BANCO DE DADOS 1
C. SELECT … INTO
Com o comando SELECT…INTO é possível criar uma nova tabela no banco de dados
a partir de outra(s) tabela(s) existente(s).
Por exemplo:
Obs: Para que este tipo de comando seja executado, é necessário que a opção 'select
into/bulkcopy' esteja ativa no bando de dados. Após a execução de um comando
SELECT...INTO não será mais possível fazer backup do log de trasações. Para ativar a
opção, execute o comando abaixo:
Você pode copiar dados de uma tabela para outra utilizando o comando INSERT
conjuntamente com o comando SELECT. Exemplificaremos utilizando as tabelas
abaixo.
TAB_A
Coluna_A Coluna_B
1001 A1
2002 D2
TAB_B
Coluna_C Coluna_D Coluna_E
F3 1/1/2000 3003
G2 2/2/2000 4004
H5 3/3/1999 5005
Página 37 de 39
FALS – BANCO DE DADOS 1
O SELECT poderia ter uma cláusula WHERE especificando as linhas a serem copiadas.
E. UNION
Através do operador UNION é possível combinar o resultado de duas consultas, desde
que ambas produzam seus resultados com a mesma quantidade de colunas e com os
mesmos tipos de dados (ou similar) coluna a coluna.
Select Coluna_B,Coluna_A from TAB_A union all select Coluna_C, Coluna_E from TAB_B
Coluna_B Coluna_A
A1 1001
D2 2002
F3 3003
G2 4004
H5 5005
Com a palavra ALL todas as linhas são incorporadas no resultado final, incluindo
duplicadas. Se não especificada, linhas duplicadas são removidas.
F. UPDATE …FROM …
No comando acima, apenas os funcionários com pelo menos 1 dependente terão seus
salários aumentados em 10 %. Isto se deve ao fato de que no INNER JOIN apenas as
linhas em funcionários com correspondentes em dependentes compõem o resultado do
join.
Note que apenas quando a subquery gerar alguma linha, ou seja quando existir em
Dependentes alguma linha com o valor em NumeroFunc igual ao valor em NumeroFunc
de Funcionário, é que o WHERE do UPDATE será VERDADEIRO e a linha de
Funcionário atualizada.
Página 38 de 39
FALS – BANCO DE DADOS 1
G. DELETE … FROM …
De forma análoga aos exemplos do item anterior, podemos excluir linhas de uma tabela
com base em valores de outras tabelas.
Delete funcionarios
From funcionarios f inner join dependentes d on f.NumeroFunc = d.NumeroFunc
O comando acima exclui da tabela Funcionários todos os funcionários com pelo menos
1 dependente (é só um exemplo!). Isso se não existir uma FOREIGN KEY entre
Funcionários e Dependentes. Abaixo o mesmo exemplo utilizando subquery, só que
desta vez excluindo os funcionários sem dependentes (repare no not).
Delete funcionarios
Where not exists (select * from dependentes d where
funcionarios.numerofunc=d.numerofunc)
Página 39 de 39