Você está na página 1de 46

Fundamentos de Banco de Dados

2013/1
Aula 16
Prof. Pablo Ariel do Prado Lpez

Fundamentos de Banco de Dados

04/06/2013

Agenda
Avanando em SQL
Views
Joins
Select Into
Group By
Order By
Having
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
VIEWS
So tabelas virtuais compostas por linhas e colunas
de dados.
Originadas de tabelas relacionadas em uma query
(um agrupamento de SELECTs, por exemplo).
As linhas e colunas da View so geradas
dinamicamente no momento em que feita uma
referncia a ela.
A query que determina uma View pode vir de uma
ou mais tabelas ou at mesmo de outras Views.
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
CRIANDO UMA VIEW
A sintaxe de criao de uma VIEW segue abaixo:
CREATE
VIEW <view_name> AS
<instruo_SELECT>

Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
Dica: No atribua a uma view, um
nome j utilizado para outro
objeto j existente no mesmo
banco de dados.

Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
CONSULTANDO UMA VIEW
Utilizamos o comando SELECT, da mesma
forma que se estivssemos fazendo uma
consulta em uma tabela comum.
SELECT * FROM (nome_view) [WHERE condies]

Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
Para uma melhor identificao dos campos e
das prprias tabelas em uma View pode-se
utilizar o que chamamos de Alias.
Com a View podemos incluir dados em uma
tabela.
As colunas da tabela de origem que no so
exibidas na View devem:
Aceitar valores nulos,
Ser auto incrementais
Ou ter um valor padro (que use a constraint Default)
definido
para
elas.
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
Quando manipulamos os dados de
uma tabela de origem da View, essa
ao se reflete automaticamente
na View gerada.

Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
Como recuperar dados que esto
espalhados entre vrias tabelas do
banco de dados e se relacionam de
alguma maneira?

Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
JOIN JUNES
As JOIN ou associaes so operaes que
permitem consultar duas ou mais tabelas para
produzir um conjunto de resultados que
incorpore registros e colunas de cada tabela.
Podem ser associadas tabelas em qualquer
expresso que seja baseada em qualquer
coluna ou combinao de colunas das tabelas
envolvidas.
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
As junes podem ser basicamente de quatro tipos:
INTERNAS INNER
As junes internas ou INNER JOIN combinam tabelas comparando valores
em colunas que sejam comuns a ambas as tabelas.
EXTERNAS OUTER
As junes externas esquerda ou direita combinam registros de duas
tabelas que correspondem condio de associao, alm de quaisquer
registros no-correspondentes da tabela esquerda ou direita,
conforme especificado na clusula JOIN.
CRUZADAS CROSS
As junes cruzadas realizam a combinao de TODAS as linhas da
primeira tabela com TODAS as linhas da segunda tabela, resultando no
produto cartesiano de um para todos, pois no utiliza a clusula ON.
AUTO JUNES SELF
As auto junes realizam a combinao de uma tabela com ela mesma.
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
A utilizao da juno escreve-se atravs da
seguinte sintaxe:

SELECT
tabela1.campo1,
tabela1.campo2,
tabela2.campo2, tabela2.campo2
FROM Tabela1 [INNER, LEFT, RIGHT, CROSS,
FULL] JOIN Tabela2
ON tabela1.campo3 = tabela2.campo3
WHERE ...
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
SELECT a instruo de seleo de dados j
conhecida.
INNER, LEFT, RIGHT, CROSS, FULL o tipo de
juno a ser aplicada na consulta, explicadas
a seguir.
ON usado para determinar ou igualar os
campos em comum das tabelas relacionadas.
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
INNER JOIN Associaes Internas
Geralmente a maneira mais utilizada de se
retornar dados espalhados entre tabelas.
Segue o princpio de que para os registros retornados
de uma tabela, deve haver algum tipo de relao
com os registros da outra tabela.
Atravs desta juno, so retornadas todas as
linhas das tabelas envolvidas nas consulta e que
correspondam ao critrio estabelecido na
clusula ON.
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
O NATURAL JOIN e o STRAIGHT_JOIN fazem exatamente a mesma
coisa que o INNER JOIN em questo de resultado, porm com suas
particularidades:
NATURAL JOIN: com ele voc no precisa identificar quais colunas
sero comparadas, pois ele far a comparao entre campos com
mesmo nome.
STRAIGHT_JOIN: faz com que a tabela a esquerda seja lida
primeiro, isso utilizado quando o otimizador do JOIN coloca as
tabelas em ordem errada. Isto muito pouco utilizado.

Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
Associaes Externas OUTER
LEFT (OUTER) JOIN
Ao juntar a tabela A com a tabela B utilizando o LEFT JOIN, todas as
linhas de A sero retornadas, mesmo que no seja encontrada uma
linha em B que atenda ao critrio de alguma linha em A.
Se uma linha da tabela A no estiver associada a uma linha da
tabela B e o resultado da consulta apresentar colunas da tabela B,
estas colunas sero retornadas com o valor NULL para esta linha.
Apesar de no ser recomendado, a instruo pode ser substituda
pelo operador *=
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
RIGHT (OUTER) JOIN
O RIGHT JOIN muito semelhante ao LEFT JOIN. A
diferena fundamental que sero retornadas todas
as linhas da segunda tabela participante da juno.

Assim como no LEFT JOIN, a ordem das tabelas


participantes importante e pode alterar o resultado
de um RIGHT JOIN.
Apesar de no ser recomendado, a instruo pode
ser substituda pelo operador =*
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
FULL (OUTER) JOIN
O funcionamento do FULL JOIN uma
combinao do LEFT JOIN e o RIGHT JOIN
simultaneamente.
Obtm-se como resultado uma combinao
das linhas de A e B que respeitam a condio
definida na clusula ON.
Tambm faro parte do resultado as linhas de
ambas as tabelas que no foram associadas.
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
Associaes Cruzadas (Produto Cartesiano)
CROSS JOIN
O CROSS JOIN diferencia-se dos outros tipos de
juno, pois no permite que seja especificada uma
condio para a juno (Clusula ON).
No h filtros, define-se apenas quais tabelas
participaro da juno.
Assim, o resultado ser uma combinao de TODAS
as linhas da primeira tabela com TODAS as linhas da
segunda tabela.
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
Auto Associaes
SELF JOIN
O SELF JOIN normalmente utilizado para as junes onde uma tabela
associada a ela mesma.
Todas os tipos de junes descritos acima podem ser utilizadas para
realizar um SELF JOIN, basta que seja realizado de uma tabela com ela
mesma.
Por exemplo em uma tabela de empregados onde um dos atributos seja o
cdigo do chefe, que tambm um empregado (auto relacionamento).
A expresso OUTER representa que so tabelas diferentes, enquanto o
SELF que da mesma tabela, porm o SELF no explicitamente usado no
comando.
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
Exemplo:

Criao de duas tabelas temporrias com apenas uma coluna do tipo inteiro em
cada uma.

-- Criando tabela A
CREATE TABLE #a (id int)
-- Criando tabela B
CREATE TABLE #b (id int)

-- Populando tabela A
INSERT INTO #a VALUES (1)
INSERT INTO #a VALUES (2)

-- Populando tabela B
INSERT INTO #b VALUES (1)
INSERT INTO #b VALUES (3)
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
SELECT * FROM #a A
INNER JOIN #b B
ON A.id = B.id
SELECT * FROM #a a
LEFT JOIN #b b
ON a.id = b.id
SELECT * FROM #a a
RIGHT JOIN #b b
ON a.id = b.id
SELECT * FROM #a a
FULL JOIN #b b
ON a.id = b.id
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
SELECT * FROM #a
CROSS JOIN #b
No resultado acima, verificamos que cada linha da
tabela #a foi combinada com uma linha da tabela #b,
no houve filtros ou restries.
Para obter o mesmo resultado podemos utilizar
outras duas sintaxes: retirar o CROSS JOIN e inserir
uma vrgula (,) ou usar o INNER JOIN sem a condio
de comparao (ON). O resultado ser o mesmo.
SELECT * FROM #a, #b;
SELECT * FROM #a INNER JOIN #b
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
DICAS:
Procure criar ndices para os campos utilizados com
frequncia para realizar junes, garantindo assim
uma performance maior no processamento das
junes.
Evite utilizar o CROSS JOIN. Ele pode impactar
seriamente no desempenho de seu servidor SQL
Server.
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
SELECT INTO
A instruo SELECT INTO cria uma tabela e a popula
com o conjunto de resultados da instruo SELECT.
Pode ser usada para combinar dados de vrias
tabelas ou exibies em uma nica tabela.
A estrutura da nova tabela definida pelos atributos
das expresses na lista de seleo.
O comando tambm pode ser til para a criao de
backups de tabelas importantes dentro de um
sistema.
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
Exemplo:
Suponha a existncia de uma tabela empregados com a
seguinte estrutura:
create table empregados
(
codEmpregado int not null identity (1,1),
nome varchar(50),
cargo varchar (20),
codChefe int,
primary key (codEmpregado)
)
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
A partir da tabela empregados, queremos separar os cargos
em uma tabela separada, para poder cadastrar novos cargos
sem ter a necessidade de ter que cadastrar um funcionrio.
Utilizaremos a seguinte sintaxe:

SELECT DISTINCT cargo INTO Cargos


FROM Empregados
ORDER BY cargo

Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
GROUP BY

Clusula utilizada em conjunto


com as funes de agregao
para agrupar sua consulta
(ResultSet) por uma ou mais
colunas.
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
Deve ser utilizado sempre que
queremos utilizar uma funo
de agregao para trazer um
valor, com alguma outra
coluna onde no efetuamos
nenhuma operao.
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
Exemplo:
SELECT CodProduto, COUNT(*) AS Total
FROM ItemVenda
GROUP BY CodProduto

Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
Exemplo:
SELECT Nome, SUM(Quantidade) AS Estoque'
FROM Produtos
GROUP BY Nome

Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
HAVING
Especifica um critrio de pesquisa para um
grupo ou um agregado.
Geralmente usada com a clusula GROUP BY.
diferente do WHERE, visto que este restringe
os resultados obtidos sempre aps o uso da
clusula
FROM,
ao
passo
que
a
clusula HAVING filtra o retorno do
agrupamento.
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
WHERE
serve
para
filtros
condicionais (onde isto igual a
aquilo, etc).
HAVING somente pode ser utilizado
com o GROUP BY, e serve para filtros
onde o WHERE no pode ser
utilizado, como por exemplo funes
agregadas.
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
Exemplo:
SELECT coluna_1, sum(coluna_2)
FROM tabela
WHERE coluna_1 = %exemplo%
GROUP BY coluna_1
HAVING sum(coluna_2) > 100
Ou seja, o HAVING pode fazer um filtro
no resultado da soma (funo agregada).
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
Exemplo:
SELECT CodProduto, COUNT(*) AS Total
FROM ItemVenda
GROUP BY CodProduto
HAVING (COUNT(*) > 50)

Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
Exemplo:
SELECT Nome, SUM(Quantidade) AS 'Estoque'
FROM Produtos
GROUP BY Nome
HAVING SUM(Quantidade) > 200

Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
ORDER BY
A clusula ORDER BY classifica os resultados da
consulta por uma ou mais colunas
A clusula ORDER BY no vlida em vises,
procedimentos armazenados e subconsultas, a
menos que TOP tambm seja especificada.
O padro ordem crescente (ASC).
Fundamentos de Banco de Dados

04/06/2013

Avanando em SQL
Exemplo:
SELECT CodProduto, Nome, PrecoUnitario
FROM Produto
ORDER BY PrecoUnitario [DESC/ASC]

Fundamentos de Banco de Dados

04/06/2013

Exerccios
VIEWS:
Considerando a tabela programador
listada anteriormente, crie uma
viso
que
liste
todos
os
programadores, e depois consulte a
mesma incluindo algum critrio de
filtro.
Fundamentos de Banco de Dados

04/06/2013

Exerccios
JOINS:
Liste todos os programadores, suas
linguagens de trabalho e as
empresas onde trabalham. Pode ser
utilizada uma View para esta
finalidade.

Fundamentos de Banco de Dados

04/06/2013

Exerccios
Realize as mesmas consultas
utilizando as outras formas de
juno vistas em aula.

Fundamentos de Banco de Dados

04/06/2013

Exerccios
SELECT INTO:
Realize uma consulta para criar uma
tabela de backup da tabela de
programadores.
Considerando a tabela Aluno criada
na aula anterior, crie uma tabela de
contatos, utilizando os atributos
apropriados.
Fundamentos de Banco de Dados

04/06/2013

Exerccios
GROUP BY:
Utilizando a tabela de
programadores e linguagens como
base, realize a contagem total de
programadores e agrupe por
linguagem, apresentando a
linguagem e o total de
programadores de cada linguagem.
Fundamentos de Banco de Dados

04/06/2013

Exerccios
HAVING:
Considerando o exerccio anterior,
inclua um critrio para que sejam
apresentadas as linguagens que
possuem no mnimo 1 programador.

Fundamentos de Banco de Dados

04/06/2013

Exerccios
ORDER BY:
Consulte as Views criadas e ordeneas por nome e linguagens que os
mesmos programam. Faa as
alteraes na View que julgar
necessrias para atender o critrio.

Fundamentos de Banco de Dados

04/06/2013

Obrigado!

Perguntas?
Dvidas?

Fundamentos de Banco de Dados

04/06/2013