0% acharam este documento útil (0 voto)
32 visualizações10 páginas

SQL Turbinado

O documento aborda conceitos avançados de SQL, incluindo filtros de dados, uso de operadores como DISTINCT, WHERE, AND/OR/NOT e a manipulação de tabelas através de JOINs. Ele explica diferentes tipos de JOINs, como INNER JOIN, LEFT JOIN e FULL OUTER JOIN, além de introduzir o conceito de subqueries para consultas mais complexas. Recomenda leituras adicionais para aprofundamento nos tópicos discutidos.

Enviado por

felipe.mram
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
32 visualizações10 páginas

SQL Turbinado

O documento aborda conceitos avançados de SQL, incluindo filtros de dados, uso de operadores como DISTINCT, WHERE, AND/OR/NOT e a manipulação de tabelas através de JOINs. Ele explica diferentes tipos de JOINs, como INNER JOIN, LEFT JOIN e FULL OUTER JOIN, além de introduzir o conceito de subqueries para consultas mais complexas. Recomenda leituras adicionais para aprofundamento nos tópicos discutidos.

Enviado por

felipe.mram
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Banco de Dados para Tecnologia da

Informação

UNIDADE 05

SQL Turbinado

UMA INTRODUÇÃO AO FILTRO DE DADOS

De forma bem resumida, o que vimos até o momento é tão somente uma seleção
simples de dados. Agora, imagine o seguinte cenário: você é um estagiário que foi
recentemente contratado em uma empresa e o seu trabalho implica selecionar todos os
clientes que não pagaram as suas contas no último mês. Bom, e como você vai
conseguir fazer isso somente com o que aprendeu na semana passada? Perceba que,
até o momento, você seria capaz de selecionar todas as linhas e todas as colunas de
uma única tabela. Ainda que isso não se pareça muito com um problema agora, tente
imaginar aqueles casos em que temos dezenas de milhões de clientes ou, ainda,
algumas centenas de colunas.
Por isso, gostaria que você entendesse melhor alguns operadores adicionais que serão
muito úteis no seu cotidiano em SQL. Principalmente:
1. DISTINCT: remove automaticamente todas as linhas duplicadas do seu SELECT
(da sua seleção);
2. WHERE: permite incluir filtros no seu SELECT;
3. AND/OR/NOT: permitem incluir mais de um filtro/condição na sua comparação.
Funcionam de forma muito parecida com o que você já deve ter visto em Python.
Correspondem aos operadores lógicos “e”, “ou” e “não”, respectivamente;
4. NULL: permite filtrar e representar casos em que nenhum valor foi informado –
isto é útil para encontrar valores em colunas que não obrigam o preenchimento de
algum dado.

NA LITERATURA

Temos alguns exemplos e explicações adicionais muito úteis na breve leitura da seção
Instruções DML e operadores relacionais em SQL (páginas 107 a 111) do livro: Pichetti,
Roni Francisco et al.Banco de Dados.Porto Alegre: SAGAH, 2020. Recomendo muito que
veja antes de prosseguirmos.

APELIDOS

Logo após esta seção vamos começar a trabalhar com duas tabelas ao mesmo tempo
dentro de um único SELECT. Logo, as coisas podem começar a ficar bem confusas.
Vamos supor que tenhamos duas tabelas: uma chamada Estudantes e que possua
vários dados dele incluindo uma chave primária com o nome de CodEstudante e outra
coluna chamada Nome.

SELECT CodEstudante, Nome FROM Estudantes;

Agora, vamos supor que tenhamos outra tabela chamada Cursos, a qual também
possua vários dados de cursos. Dentre várias colunas, ela teria uma chave primária
(CodCurso) e uma outra coluna chamada Nome. Para selecionar todos os dados destas
duas colunas nesta tabela poderíamos fazer algo como:

SELECT CodCurso, Nome FROM Cursos;

Beleza, né? Agora, e se quiséssemos juntar de alguma forma as informações destas


duas tabelas dentro de um único SELECT? Não é agora que veremos isto, mas gostaria
de chamar a sua atenção para uma coisa: ambas possuem uma coluna chamada
“Nome”, mas ela possui um significado completamente diferente dependendo da
tabela. Ou seja: uma se refere ao nome dos estudantes e, outra, dos cursos. Agora, e se
quiséssemos mostrar somente o nome dos estudantes? Como o SQL saberia qual das
duas colunas chamada “Nome” ela deveria utilizar? Lembre-se que elas possuem
exatamente o mesmo nome.
O jeito é deixar de forma explícita o nome da tabela também. O padrão é sempre
“Tabela.Coluna”, onde em primeiro lugar informamos o nome da tabela e, depois, o
nome da coluna. Entre ambas as descrições utilizamos um ponto. Como isso ficaria nos
exemplos acima? Observe:

SELECT Estudantes.CodEstudante, Estudantes.Nome FROM Estudantes;

SELECT Cursos.CodCurso, Cursos.Nome FROM Cursos;

Isto será muito útil para evitarmos confusões – principalmente em casos em que temos
muitas colunas com descrições ambíguas. O problema disso é o tamanho no nome das
tabelas. Com duas colunas é relativamente fácil, mas já imaginou como seria se fossem
50 colunas? Ter que informar o “Estudantes.” no início de cada coluna na primeira query
seria um trabalho cansativo e que traria problemas de legibilidade.
Por isso, uma forma de se resolver isso é com o uso de um alias (apelido). O alias é uma
forma de atribuirmos um nome um pouco mais curto (ou um pouco mais amigável)
para as nossas chamadas. Ela vale somente para aquela query, e nos ajuda a organizar
as coisas. Veja, por exemplo, o que aconteceríamos se chamássemos o tabela
“Estudantes” de “e” e a de “Cursos” como “c”:

SELECT e.CodEstudante, e.Nome FROM Estudantes AS e;


SELECT c.CodCurso, c.Nome FROM Cursos AS e;

Isto também se aplica ao nome de colunas, onde é possível determinarmos nomes mais
amigáveis como, por exemplo no nome do curso:

SELECT c.CodCurso, c.Nome AS 'Nome do Curso' FROM Cursos AS e

JOINS

Este é um tópico que realmente causa confusão para muitos iniciantes – por isso, leia
esta seção com carinho. Um join (junção) é uma palavra-chave do SQL que é utilizada
para unificar diferentes tabelas para se chegar a um único resultado. Pensemos em
alguns casos:
1. Selecione todos os estudantes da tabela “Estudantes”;
2. Selecione todos os cursos da tabela “Cursos”;
3. Selecione todos os estudantes que tenham o nome iniciado com a letra “A”;
4. Selecione todos os estudantes que estejam matriculados em um curso chamado
“Odontologia”.

Agora, vamos partir da premissa que as colunas tenham a seguinte estrutura:

#ParaTodosVerem

Autoria: Professor autor

Com os conhecimentos que você possui até o momento é muito provável que consiga
responder praticamente a todas as questões, não é? Pensemos nas respostas:
1. SELECT * FROM Estudantes;
2. SELECT * FROM Cursos;
3. SELECT * FROM Estudantes WHERE Nome LIKE ‘A%’;
4. ???

A quarta e última se parece com uma armadilha. Pensemos: para selecionar todos os
estudantes bastaria fazer um SELECT da tabela Estudantes, certo? O problema é que o
nome do curso fica em outra tabela: no caso, na tabela Cursos. Isto posto, como
poderíamos fazer uma consulta? Como fazer dois selects para dar um resultado só, ou
uma tabela só? É para isto que existe o JOIN. Vejamos como isto funcionaria na prática.

Consultas usando joins

Agora, você deve ter visto que existem diferentes tipos de join. Vamos exemplificar
utilizando ainda o exemplo das tabelas de Estudantes e Cursos. Os mais utilizados são:

1. INNER JOIN (ou JOIN):


a. Utilize isto para selecionar somente as ocorrências que existam em ambas as
tabelas:
b. Exemplo: SELECT Estudantes.*, Cursos.* FROM Estudantes INNER JOIN Cursos
ON Estudantes.CodCurso = Cursos.CodCurso;
i. Este exemplo retornará a relação completa de estudantes que estejam
cadastrados em cursos que existam hoje na tabela Cursos, e cursos que
tenham estudantes.
ii. Neste exemplo, se um estudante chamado “Paulo” não estiver
cadastrado em nenhum curso ele não aparecerá na seleção.
iii. Ainda, se um curso chamado “Dados Quânticos” não tiver nenhum
estudante, ele também não aparecerá na seleção final.
2. LEFT JOIN:
a. Utilize isto para retornar todas as ocorrências da tabela principal, mesmo
que não tenham correspondentes na tabela utilizada em seu join.
b. Exemplo: SELECT Estudantes.*, Cursos.* FROM Estudantes LEFT JOIN Cursos
ON Estudantes.CodCurso = Cursos.CodCurso;
i. Este exemplo retornará todos os estudantes cadastrados, ainda que eles
não estejam cadastrados em nenhum curso.
ii. Este exemplo não retornará os cursos sem alunos.
iii. Aqui, o estudante “Paulo” (que não está cadastrado em curso algum)
aparecerá na seleção.
iv. Aqui, o curso “Dados Quânticos” não aparecerá.
c. Exemplo: SELECT Estudantes.*, Cursos.* FROM Cursos LEFT JOIN Estudantes
ON Cursos.CodCurso = Estudantes.CodCurso;
i. Este exemplo retornará todos os cursos cadastrados, ainda que eles não
possuam nenhum estudante matriculado.
ii. Este exemplo não retornará os estudantes que não estejam cadastrados
em um curso.
iii. Aqui, o estudante “Paulo” (que não está cadastrado em curso algum)
não irá aparecer na seleção.
iv. Aqui, o curso “Dados Quânticos” aparecerá na seleção.
3. FULL OUTER JOIN:
a. Utilize isto para selecionar todas as entradas independentemente se houver
uma correspondência na outra tabela ou não.
b. Exemplo: SELECT Estudantes.*, Cursos.* FROM Estudantes FULL OUTER JOIN
Cursos ON Estudantes.CodCurso = Cursos.CodCurso;
i. Este exemplo retornará todos os estudantes e todos os cursos.
ii. Neste exemplo, o estudante “Paulo” aparecerá na seleção.
iii. Aqui, o curso “Dados Quânticos” também aparecerá na seleção final.

Para um melhor entendimento das diferenças dos JOINs não há nada melhor do que
um exemplo mais visual, correto? Dessa maneira, analise os diferentes tipos de JOINs
na imagem abaixo. Ela utiliza a teoria dos conjuntos para lhe explicar de uma maneira
gráfica as semelhanças e diferenças entre estas configurações.
#ParaTodosVerem

NA LITERATURA

Finalmente, veja também a leitura em Operadores de conjuntos e junções de tabelas


(Junções) (páginas 116 a 119) do livro: Pichetti, Roni Francisco et al.Banco de
Dados.Porto Alegre: SAGAH, 2020. Esta leitura lhe traz um melhor contexto sobre o uso
do JOIN.
Isto posto, vale a pena observar que, de forma resumida, o JOIN permite a junção de
tabelas diferentes – isto é, que tratam de entidades separadas e que não
necessariamente possuam uma relação direta uma com a outra.
Agora, e se quiséssemos unir dados dentro de uma mesma tabela, ou dados que
tenham uma mesma estrutura de colunas? É para isto que existem outras três palavras-
chave que são utilizadas no lugar do JOIN: o UNION, o INTERCEPT, e o EXCEPT. Dessas, o
UNION é o mais conhecido. Veja mais sobre estas palavras-chave na leitura Operadores
de conjuntos e junções de tabelas (páginas 114 a 116) do livro: Pichetti, Roni Francisco
et al. Banco de Dados. Porto Alegre: SAGAH, 2020.

SUBQUERIES

Existem ainda cenários nos quais os JOIN/WHERE/UNION não são suficientes. Como um
exemplo ilustrativo, pensemos nas seguintes queries:

1. Selecione todos os estudantes que tenham o nome iniciado com a letra “A”;
2. Selecione todos os estudantes que estejam matriculados em um curso chamado
“Odontologia”;
3. Selecione todos os estudantes que estejam matriculados em um curso com 5
estudantes ou mais.

As duas primeiras já foram apresentadas quando estávamos falando sobre os joins. Por
isso, as respostas para estas perguntas poderiam ser:

1. SELECT * FROM Estudantes WHERE Nome LIKE 'A%';


2. SELECT e.* FROM Estudantes AS e INNER JOIN Cursos AS c ON c.CodCurso =
e.CodCurso WHERE c.Nome = 'Odontologia';
3. ???

Veio de novo a dúvida, certo? Para endereçar estes filtros mais complexos é que existem
as subqueries. Para resolver à terceira pergunta, vamos quebrá-la em partes:

1. Selecione todos os cursos com 5 estudantes ou mais;


2. Selecione todos os estudantes que estejam em um curso que foi selecionado pelo
ponto anterior.

A resposta da primeira parte é fácil, não é? Poderíamos fazer algo como:

1. SELECT DISTINCT CodCurso FROM Estudantes GROUP BY CodCurso HAVING


COUNT(CodCurso) >= 5;

Esta query garantiria que estivéssemos retornando somente o código do curso (que é o
que precisamos) que possuam uma contagem de pelo menos 5 linhas cadastradas na
tabela “Estudantes”. Como 1 linha = 1 estudante dentro desta tabela, na prática
estaríamos selecionando somente os cursos com 5 estudantes ou mais.
Agora, vamos utilizar esta seleção de cursos para obter os dados adicionais dos
estudantes:

1. SELECT * FROM Estudantes WHERE CodCurso IN (SELECT DISTINCT CodCurso FROM


Estudantes GROUP BY CodCurso HAVING COUNT(CodCurso) >= 5)

Perceba que temos aqui um SELECT dentro de outro SELECT. Este é um exemplo de
subquery. Em outras palavras, é uma consulta (query) dentro de outra consulta. Ainda
que isto possa ter alguns problemas de performance dependendo do tipo de filtro e
seleção que estamos fazendo, ele nos dá algumas oportunidades de seleções mais
avançadas nos dados que não seria possível utilizando as outras técnicas.

Por isso, para finalizar o conteúdo da semana bem, sugiro assistir ao vídeo
complementar abaixo o qual demonstra o uso de subqueries. Depois, leia também o
capítulo 7: Consultas complexas em SQL (páginas 119 a 134) do livro: Pichetti, Roni
Francisco et al. Banco de Dados.Porto Alegre: SAGAH, 2020. Não se assuste com a
quantidade de páginas: várias delas possuem queries que acabam ocupando quase
uma página inteira cada para lhe demonstrar alguns exemplos dessas queries.

Consultas usando subqueries

© PUCPR - Todos os direitos reservados.

Você também pode gostar