SQL
SQL
Agora vamos abrir o Workbench e fazer uma análise prática do banco de dados sakila, que já deve estar
instalado, caso você tenha feito a instalação do MySql Workbench de forma padrão. Caso o banco sakila
não esteja disponível, volte até a seção Restaurando o banco de dados de prática sakila e siga as
instruções listadas. Com esse banco disponível na sua instalação do Workbench, sua missão agora é
tentar finalizar os exercícios a seguir!
Exercício 1: Descubra como fazer uma pesquisa em qualquer tabela sem usar uma linha de código
usando o MySql Workbench.
Exercício 2: Descubra como é possível criar uma tabela sem usar código SQL usando o MySql Workbench.
Colunas:
FilmeId - primary key, tipo int, incrementa por 1 cada vez que um valor é inserido automaticamente;
Exercício 4: Analise a tabela city e encontre a tabela à qual a coluna country_id faz referência.
Exercício 5: Após resolver o exercício anterior, responda: qual tipo de relacionamento a tabela city faz
com a tabela country?
Exercício 6: Qual tipo de relacionamento a tabela country faz com a tabela city?
Exercício 7: Abra tabela por tabela do banco sakila e encontre no mínimo 3 exemplos de um
relacionamentos 1:N ou N:1.
Bem-vindo de volta! Hoje você vai começar a juntar as peças da sua jornada que te levarão a aprender a
manipular e a transformar dados em informação, e informação em conhecimento!
Compreender o que é uma query SQL e quais são seus tipos de comando
A razão pela qual uma base de dados existe é para que alguém, ou algum programa, faça pesquisas nela.
As pesquisas, principalmente o comando SELECT, são como o café da manhã para alguém que tem
costume de tomá-lo todo dia: sem ele você não vai muito longe.
Como foi dito na aula anterior, quando você se conecta a um banco de dados, você tem a opção de fazer
boa parte das suas pesquisas e manipulação de dados usando ferramentas gráficas, que estão
disponíveis para uso e download. O MySQL Workbench, visto na última aula, faz exatamente isso. No
entanto, é importante que você tenha uma base sólida do SQL para que possa entregar resultados bem
específicos e fazer pesquisas em situações em que você não disponha de uma ferramenta gráfica.
Para ser capaz que montar suas pesquisas personalizadas, você precisa saber usar o comando SELECT,
então vamos lá!
Conteúdos
Inquirir, ou query, em inglês, é o nome dado aos comandos que você digita dentro de uma janela ou
linha de comando com a intenção de interagir de alguma maneira com uma base de dados. No mundo
de banco de dados, você pode tanto trazer dados quanto alterá-los, atribuir permissões de acesso e
manipulação e muito mais. Vamos dar um olhada nos principais tipos de queries a seguir:
DDL: Data Definition Language - todos os comandos que lidam com o esquema, a descrição e como os
dados devem existir em um banco de dados:
CREATE - Para criação de bancos de dados, tabelas, índices, views, procedures, functions e triggers
TRUNCATE - Apenas esvazia os dados dentro de uma tabela, mas a mantém no banco de dados
DML: Data Manipulation Language - os comandos que são usados para manipular dados. São
utilizados para armazenar, modificar, buscar e excluir dados em um banco de dados. Os comando e usos
mais comuns nesta categoria são:
DCL: Data Control Language - Focado mais nos comandos que concedem direitos, permissões e outros
tipos de controle ao sistema de banco de dados.
TCL: Transactional Control Language - Lida com as transações dentro de suas pesquisas.
COMMIT - Muda suas alterações de temporárias para permanentes no seu banco de dados
SAVEPOINT - Define pontos para os quais uma transação pode voltar. É uma maneira de voltar para
pontos específicos de sua query
TRANSACTION - Comandos que definem onde, como e em que escopo suas transações são
executadas
Antes de assistir à aula a seguir, temos 2 conceitos importantes que podem ser utilizados já no início do
seu aprendizado de SQL. Esses conceitos são usar o SELECT para gerar valores e usar o AS para dar
nomes às suas colunas, como nos exemplos a seguir. Rode cada um deles em uma janela de query para
verificar os resultados:
_____________________________________________
SELECT now();
SELECT 20 * 2;
SELECT 50 / 2;
SELECT 18 AS idade;
__________________________________________________
Depois de rodar cada um desses comandos, vemos que é possível fazer algumas coisas apenas usando o
SELECT, ainda sem alterar o banco de dados.
Perceba que a palavra-chave AS permite que você dê nome às suas colunas para que elas façam mais
sentido quando estiver lendo os resultados. Lembre-se de que, caso o nome tenha mais de uma palavra,
devemos usar aspas simples para nomear as colunas;
Note que sempre finalizamos uma query usando o ponto e vírgula (;);
Observe também que as palavras-chave (reservadas) estão em maiúsculo. Isso é uma convenção para
facilitar a leitura da query. É recomendado que faça o mesmo.
Monte uma query que exiba seu nome, sobrenome, cidade natal e idade na tela;
Monte uma query que, além de exibir todas as informações acima, identifique cada coluna usando o
AS, que é chamado de alias na linguagem SQL (alias é como um apelido no português);
Monte uma query que exiba a data e hora atuais. Dê a essa coluna o nome "Data Atual".
Agora, vamos aprender um pouco mais sobre como usar o SELECT assistindo a essa aula:
(anotado)
Vamos agora entrar no banco de dados sakila e encontrar as seguintes informações, montando uma
query para cada uma:
Escreva uma query que exiba apenas as colunas first_name e last_name da tabela customer;
Escreva uma query que exiba o título, a descrição e a data de lançamento dos filmes registrados na
tabela film;
Dê uma pesquisada agora na tabela sakila.actor usando o comando SELECT * FROM sakila.actor e veja
que temos uma coluna first_name e outra chamada last_name. Vamos imaginar que é necessário criar
um relatório com o nome completo de um ator. Como podemos fazer isso? É fácil, basta usar a função
CONCAT.
-- Seu resultado ficou estranho? Eu também achei! Tente agora a query a seguir.
SELECT CONCAT(first_name, ' ', last_name) FROM sakila.actor;
____________________________________________
Então, como podemos ver no exemplo acima, é possível concatenar mais de uma coluna em apenas
uma. Para isso, usamos a função CONCAT, que cria novos dados e informações a partir dos dados já
existentes em uma tabela.
Na tabela sakila.film, monte uma query que exiba o título e o ano de lançamento dos filmes em uma
coluna e dê a ela o nome Lançamento do Filme.
Na tabela sakila.film, crie uma query que exiba o título do filme e sua classificação indicativa (PG, G,
NC-17) em apenas uma coluna. Dê a ela o nome Classificação. Não se esqueça de deixar um espaço
entre as palavras para que fiquem legíveis.
Na tabela sakila.address, monte uma query que exiba a rua e o distrito de cada registro em uma
coluna apenas, e dê a essa coluna o nome Endereço.
Espero que tenha sido tranquilo. Caso precise, veja o vídeo novamente.
Perfeito! Então, depois de ter assistido ao vídeo sobre DISTINCT, dê uma olhada nesta tabela:
Para criá-la no seu banco de dados, abra uma nova janela de query no MySQL Workbench e execute o
seguinte código:
`Idade` INT
);
('Rafael', 25),
('Amanda', 30),
('Roberto', 45),
('Carol', 19),
('Amanda', 25);
_________________________________________
Feito isso, você terá acesso à tabela Alunos do banco de dados Escola. Levando em conta a explicação
que você acabou de ver, como você montaria uma query para encontrar os seguintes dados?
Um dos principais objetivos de se usar um banco de dados é responder a perguntas como: "Qual
quantidade de um certo tipo de dados existe na tabela?". Ou em, um caso mais próximo ao nosso:
"Quantas pessoas temos cadastradas no sistema?". Ou ainda: "Em quantos estados temos clientes?".
Essa é a tabela staff do banco de dados sakila. Como você poderia responder às seguintes questões?
Até agora, trabalhamos principalmente com tabelas que têm poucas linhas de resultados (média de
200), e até aí tudo bem. Porém, em muitos cenários reais, você pode se deparar com milhares ou até
centenas de milhares de resultados, e é aqui que vamos LIMITar elas!
Escreva uma query que exiba todos os filmes cadastrados no banco de dados.
Escreva uma query que exiba apenas o nome dos filmes, seu ano de lançamento e sua classificação.
Escreva uma query que exiba apenas os sobrenomes únicos cadastrados no banco sakila.
Vá até a tabela language do sakila e crie uma pesquisa que mostre os 5 idiomas cadastrados, mas não
mostre o idioma english.
Vá até a tabela film e selecione todos os dados da tabela. Pronto, fez isso?
Agora vamos tentar fazer o seguinte: Crie uma query para encontrar os 20 primeiros filmes, incluindo
o título, o ano de lançamento, a duração, a classificação indicativa e o custo de substituição. Ordene os
resultados pelos filmes com a maior duração e depois pelo menor custo de substituição.
Exercicios : https://www.w3schools.com/sql/exercise.asp?filename=exercise_select1
https://sqlbolt.com/lesson/select_queries_introduction
https://sqlzoo.net/wiki/SELECT_basics
https://www.javatpoint.com/dbms-sql-command
USE Scientists;
CREATE TABLE Scientists (
SSN INT,
);
Code CHAR(4),
Hours INT,
);
);
(152934485, 'AeH3'),
(222364883, 'Ast3'),
(326587417, 'Ast3'),
(332154719, 'Bte1'),
(546523478, 'Che1'),
(631231482, 'Ast3'),
(654873219, 'Che1'),
(745685214, 'AeH3'),
(845657245, 'Ast1'),
(845657246, 'Ast2'),
(332569843, 'AeH4');
________________________________________________
Escreva uma query para exibir a string "This is SQL Exercise, Practice and Solution".
Escreva uma query para exibir o resultado de uma expressão aritmética qualquer.
Escreva uma query para exibir o nome e as horas dos três projetos com a maior quantidade horas.
Escreva uma query para exibir o código de todos os projetos da tabela AssignedTo sem que haja
repetições.
Escreva uma query para exibir todos os cientistas cujos projetos são Ast3.
Escreva uma query para exibir todas as informações dos projetos 5 projetos com a menor quantidade
de horas.
__________________
USE PiecesProviders;
);
);
Piece INTEGER,
Provider VARCHAR(40),
);
INSERT INTO Providers(Code, Name)
(2, 'Screw'),
(3, 'Nut'),
(4, 'Bolt');
link: https://creativecommons.org/licenses/by-sa/3.0/
___________________________________________________________
Escreva uma query para exibir a peça e o preço de tudo que é provido pela empresa RBT.
Escreve uma query para exibir todas as informações dos 5 peças com os maiores preços.
Escreva uma query para exibir o nome das empresas, sem repetições, que proveem as peças com os 4
maiores preços.
Escreva uma query para exibir todas as informações das peças que são providos pela empresa HAL.
Ordene o resultado pelos preços dos peças de forma decrescente.
Escreva uma query para exibir por quantas empresas a peça 1 é provida.
Segunda pagina
Filtrando dados de forma específica
Olá, pessoal, bem-vindos e bem-vindas de volta! Na última aula, você teve a oportunidade de dar os
primeiros passos com um banco de dados, aprendendo a filtrar e ordenar os seus resultados, além de
limitar a quantidade de dados que são exibidos. Hoje você vai expandir ainda mais seu conhecimento de
SQL, o que te permitirá criar consultas mais refinadas, complexas e precisas.
Você já deve estar conseguindo montar pesquisas básicas com certa segurança. A aula de hoje vai te dar
ainda mais recursos para montar pesquisas mais elaboradas. Assim como o fotógrafo, com novos
recursos, você vai conseguir entregar ainda mais valor através do seu trabalho. LET'S GO!
Conteúdos
Sakila mode ON! Vamos abrir nosso banco de dados sakila e aprender a lidar com o WHERE e com os
principais comparadores lógicos:
Sendo assim, quando se faz a seguinte query:
Como o operador AND tem preferência sobre o operador OR, ele é avaliado primeiro. Então os registros
buscados são aqueles nos quais amount = 2.99 e staff_id = 2. Na sequência, são buscados os registros
nos quais amount = 0.99, independente do valor de staff_id. Os valores retornados serão os resultados
dessas duas buscas. Ou seja, a query é executada como se tivesse os seguintes parênteses: amount =
0.99 OR (amount = 2.99 AND staff_id = 2).
Primeiramente, a expressão dentro dos parênteses é avaliada, e todos os resultados que satisfazem a
condição amount = 0.99 OR amount = 2.99 são retornados. Na sequência, a expressão do lado direito do
AND é avaliada, e todos os resultados que satisfazem a condição staff = 2 são retornados. O AND então
compara o resultado de ambos os lados e faz com que somente os resultados que satisfazem ambas as
condições sejam retornados.
Como foi exibido no vídeo acima, de forma geral, temos os seguintes operadores:
-- OPERADOR - DESCRIÇÃO
= IGUAL
<> DIFERENTE DE
OR OPERADOR LÓGICO OU
NOT NEGAÇÃO
Depois de ter assistido ao vídeo acima, você já deve ter agora uma noção do que pode ser feito com os
operadores do SQL e de como é possível combiná-los para trazer relatórios ainda mais granulares. Vamos
buscar algumas informações no nosso banco de dados para consolidar esse aprendizado.
Dica final: Sempre se atente a essa ordem de precedência para que consiga montar suas queries de
acordo com o que precisa. Na dúvida, use parênteses.
A tabela a seguir é um guia de como a classificação indicativa é usada no banco de dados sakila.
Consulte-a ao fazer os desafios propostos.
Entre no banco de dados sakila e siga as instruções (e guarde as queries para conferir posteriormente):
Precisamos de um relatório dos nomes, em ordem alfabética, dos clientes que não estão mais ativos
no nosso sistema e pertencem à loja com o id 2. Porém, não inclua o cliente KENNETH no resultado.
O setor financeiro quer saber nome, descrição, ano de lançamento e quais são os 100 filmes com o
maior custo de substituição, do valor mais alto ao mais baixo, entre os filmes feitos para menores de
idade e que têm o custo mínimo de substituição de $18,00 dólares.
Mostre todos os detalhes dos clientes que não estão ativos na loja 1.
Precisamos descobrir quais são os 50 filmes feitos para maiores de 17 anos e adultos com a menor
taxa de aluguel, para que possamos fazer uma divulgação melhor desses filmes.
Você vai se deparar também com casos em que você só tem parte de uma informação, ou em que
precisa criar queries mais dinâmicas. Para esses casos, temos o LIKE. Como assim? É o que veremos a
seguir.
O LIKE é usado para buscar por meio de uma sequência específica de caracteres, como no exemplo
acima. Alem disso, 2 "curingas", ou modificadores, são normalmente usados com o LIKE:
_ - O underscore (às vezes chamado de underline, no Brasil), que representa um único caractere
Vamos ver abaixo como usá-los (todos podem ser verificados no banco sakila)
-- Encontra qualquer resultado que inicia com "p" e finaliza com "r"
WHERE title LIKE 'p%r';
Para consolidar esse conhecimento, brinque com os resultados que serão encontrados usando os
comandos acima e tente criar suas próprias condições. Depois de ter praticado um pouco com eles,
tente encontrar as seguintes informações:
Encontre todos os detalhes dos filmes que contêm a palavra "ace" no nome.
Encontre todos os detalhes dos filmes cujas descrições finalizam com "china".
Encontre todos os detalhes dos 2 filmes cujas descrições contêm a palavra "girl" e o título finaliza com
a palavra "lord".
Encontre os dois casos em que, a partir do 4° caractere no título do filme, tem-se a palavra "gon".
Encontre os dois casos em que, a partir do 4° caractere no título do filme, tem-se a palavra "gon" e a
descrição contém a palavra "Documentary".
Encontre os 2 filmes cujos títulos ou finalizam com "academy" ou inciam com "mosquito".
Encontre os 6 filmes que contêm as palavras "monkey" e "sumo" em suas descrições.
A seguir, vamos entender como trazer resultados que englobam uma faixa de valores usando os
operadores IN e BETWEEN.
Operador IN
Como você viu no início do dia hoje, é possível juntar várias condições nas suas queries usando os
operadores AND e OR. No entanto, você ainda terá que digitar cada condição separadamente, como no
exemplo a seguir:
OR first_name = 'NICK'
OR first_name = 'ED'
OR first_name = 'JENNIFER';
Uma forma melhor de fazer essa mesma pesquisa seria usando o IN:
Então, para que você faça pesquisas utilizando o IN, a sintaxe que deve ser usada é a seguinte:
-- ou também
Como encontraria todas as informações sobre os endereços que estão registrados nos distritos de
QLD, Nagasaki, California, Attika, Mandalay, Nantou e Texas?
Operador BETWEEN
Uma outra opção quando queremos trabalhar com faixas de resultados é o BETWEEN, que torna possível
fazer pesquisas dentro de uma faixa inicial e final.
Então, quando você faz uma query como essa, você terá o resultado da imagem a seguir:
Para encontrar uma faixa de valores em que os valores são strings, podemos digitar a palavra por
completo para encontrar os valores. Exemplo:
ORDER BY name;
Para usar o BETWEEN com datas, basta que você digite o valor no formato padrão da data, que é YYYY-
MM-DD HH:MM:SS, sendo os valores de horas, minutos e segundos opcionais. No exemplo abaixo,
estamos filtrando os resultados para exibir o rental_id e rental_date apenas entre o mês 05 e o mês 07:
WHERE rental_date
Lembre-se de que, no caso do IN, você precisa especificar os valores que devem ser incluídos no
resultado e, no caso do BETWEEN, você não precisa incluir os valores que estão entre o valor inicial e
final. Então, vale a pena analisar essa diferença e ver qual te atenderá melhor.
Não é o que você esperava? Então vai aqui uma resposta melhor: isso vai depender do tipo e quantidade
de dados com os quais você está trabalhando. A melhor forma de você não chutar é clicar no botão
Execution Plan no MySQL Workbench e verificar o tempo de execução para tomar a decisão de qual tem
o menor custo de execução - o que significa que a query finalizará mais rápido.
Há outras ferramentas inteiras só para mensurar performance. Considere o Execution Plan apenas uma
introdução ao tema.
Fazendo um pequeno teste, temos os seguintes resultados (que podem sofrer alterações, dependendo
da quantidade de dados com os quais se está trabalhando):
No final
das contas, depois de analisar questões como performance, você poderá tomar sua decisão sobre qual
usar com mais segurança!
Consolidando o conhecimento
Encontre o nome, sobrenome e e-mail dos clientes com os seguintes sobrenomes: hicks, crawford,
henry, boyd, mason, morales e kennedy, ordenados por nome em ordem alfabética.
Encontre o e-mail dos clientes com os address_id 172, 173, 174, 175 e 176, ordenados em ordem
alfabética.
Descubra quantos pagamentos foram feitos entre 01/05/2005 e 01/08/2005. Lembre-se de que, no
banco de dados, as datas estão armazenadas no formato ano/mês/dia, diferente do formato brasileiro,
que é dia/mês/ano.
Encontre o título, ano de lançamento e duração do empréstimo de todos os filmes com a duração de
empréstimo de 3 a 6. Os resultados devem ser classificados em filmes com maior duração de
empréstimo primeiro.
Monte um relatório que exiba o título e classificação dos 500 primeiros filmes direcionados para
menores de idade. Os resultados devem estar ordenados por classificação mais abrangente primeiro.
P.S. As classificações podem ser verificadas acima, na seção "Alavancando o poder dos principais
comparadores lógicos".
No MySQL, o tipo DATE faz parte dos tipos de dados temporais, os quais vamos ver com mais detalhes no
decorrer do curso. O MySQL, por padrão, usa o formato YYYY-MM-DD (ano/mês/dia) ao armazenar os
valores de uma data. Você é obrigado, pelo banco de dados, a salvar nesse formato, e não é possível
alterá-lo. Temos também o tipo DATETIME, que inclui informações de tempo. Vamos ver 2 tipos comuns
a seguir:
DATE - Possui apenas data, no formato YYYY-MM-DD na faixa de 1001-01-01 até 9999-12-31
DATETIME - Possui data e tempo, no formato YYYY-MM-DD HH:MM:SS com a faixa de 1000-01-01
00:00:00 até 9999-12-31 23:59:59.
Vamos dizer que queremos encontrar pagamentos realizados na data 2005-07-31 na tabela
sakila.payment. Há várias formas de fazer isso.
Usando BETWEEN:
-- Encontra pagamentos especificando um valor mínimo e um valor máximo para a data
SELECT *
FROM sakila.payment
Às vezes você está interessado em apenas uma parte de uma data, como o ano ou as horas. MySQL
possui funções que retornam partes específicas de uma data ou hora.
Você já tem as ferramentas em mãos, então quero ver os dedos se mexendo. Let's GO!!!
Quantos aluguéis temos com a data de retorno 2005-08-29? Há múltiplas maneiras possíveis de
encontrar a resposta.
Quantos filmes foram alugados entre 01/07/2005 e 22/08/2005?
Usando a tabela rental, extraia a data, ano, mês, dia, hora, minuto e segundo dos registros com
rental_id = 10330.
Monte uma query que encontre o id e a data de aluguel do filme que foi alugado no dia 18/08/2005 às
00:14:03.
Exercicios
https://sqlzoo.net/wiki/SELECT_names
https://sqlzoo.net/wiki/SELECT_from_WORLD_Tutorial
https://sqlzoo.net/wiki/SELECT_from_Nobel_Tutorial
https://sqlzoo.net/wiki/SELECT_Quiz
https://sqlzoo.net/wiki/BBC_QUIZ
Bonus
https://sqlzoo.net/wiki/Nobel_Quiz
https://www.hackerrank.com/domains/sql?filters%5Bsubdomains%5D%5B%5D=select
Exercício 8: Usando o banco de dados Scientists restaurado no dia anterior realize os exercícios a seguir.
Caso ainda não tenha restaurado o banco utilize o código abaixo para fazê-lo.
USE Scientists;
SSN INT,
);
CREATE TABLE Projects (
Code CHAR(4),
Hours INT,
);
);
(152934485, 'AeH3'),
(222364883, 'Ast3'),
(326587417, 'Ast3'),
(332154719, 'Bte1'),
(546523478, 'Che1'),
(631231482, 'Ast3'),
(654873219, 'Che1'),
(745685214, 'AeH3'),
(845657245, 'Ast1'),
(845657246, 'Ast2'),
(332569843, 'AeH4');
link: https://creativecommons.org/licenses/by-sa/3.0/
Escreva uma query para exibir todas as informações de todos os cientistas que possuam a letra e em
seu nome.
Escreva uma query para exibir o nome de todos os projetos cujo o código inicie com a letra A. Ordene
o resulto em ordem alfabética.
Escreva uma query para exibir o código e nome de todos os projetos que possuam em seu código o
número 3. Ordene o resulto em ordem alfabética.
Escreva uma query para exibir todos os cientistas cujos projetos sejam AeH3, Ast3 ou Che1.
Escreva uma query para exibir todas as informações de todos os projetos com mais de 500 horas.
Escreva uma query para exibir todas as informações de todos os projetos cujas horas sejam maiores
que 250 e menores 800.
Escreva uma query para exibir o nome e o código de todos os projetos cujo o nome NÃO inicie com a
A.
Escreva uma query para exibir o nome de todos os projetos cujo o código contenha a letra H.
https://popsql.com/learn-sql/mysql/how-to-query-date-and-time-in-mysql
Segunda Parte
Gabaritos
Agenda
Aulas ao Vivo
Trybe Talks
Glossário
Logout
avatar image
TRYBE
Manipulando tabelas
Manipulando tabelas
Conteúdos:
Exercícios
Bônus
Próximo
Nos últimos dias temos visto principalmente como fazer queries para encontrar e filtrar dados em um
banco usando os diversos comandos do SQL. Porém, hoje será um pouco diferente. Vamos focar em
aprender a fazer a inserção, alteração e exclusão de dados nas tabelas de um banco de dados. Em uma
futura aula não tão distante, aprenderemos também a criar tabelas (No Spoilers!!!).
O acrônimo CRUD (Create, Read, Update, Delete) faz parte da sopa de letrinhas que todas as pessoas
desenvolvedoras devem saber. Em função das rotinas recorrentes utilizadas dentro do desenvolvimento,
todo software, independente da plataforma ou tecnologia utilizada, terá que, em algum ponto da sua
existência, lidar com a criação, leitura, alteração ou exclusão de dados
Conteúdos:
Como agora você começará a mexer na estrutura do banco de dados sakila, você deve saber recriar o
banco de dados quantas vezes for necessário, em caso de alterações acidentais ou por alguma outra
necessidade. Os passos para recriar o banco podem ser lidos a seguir.
Selecione o banco sakila na lista de bancos de dados com o botão direito e clique em "Drop Schema".
Clique com o botão direito neste link e salve como arquivo .sql.
Selecione todo o conteúdo do arquivo (CTRL + A) e cole-o dentro de uma janela de nova query no
MySQL Workbench.
That's IT! Está pronto para quebrar brincar com ele de novo!
Backticks ou crase (``): São usadas para identificar nome de tabelas e colunas. São necessárias apenas
quando o identificador for uma palavra reservada do MySQL, ou quando o nome da tabela ou coluna
contiver espaços em branco.
Aspas simples (''): Devem ser usadas em valores do tipo string. Aspas simples são aceitas na maioria dos
sistemas de gerenciamento de banco de dados. Sendo assim, é preferível usar aspas simples no lugar das
aspas duplas.
Só usaremos os backticks aqui nos exemplos caso sejam absolutamente necessários. Caso contrário, eles
serão omitidos.
Vamos começar a dar vida ao banco sakila. Uma pesquisa rápida na tabela sakila.staff nos informa que a
empresa possui apenas 2 funcionários. Acho que ela pode contar com nossa ajuda para melhorar isso. A
sintaxe para inserir dados em uma tabela é a seguinte:
Isso vai inserir na coluna nome_da_tabela os valores em suas colunas correspondentes. Apesar de ser
possível inserir novos valores sem especificar os nomes das colunas, é uma boa prática sempre
especificá-los porque:
Caso a estrutura da tabela tenha mudado enquanto se escreve a query, você será alertado.
É possível inserir múltiplas linhas em uma tabela com uma única query:
('valor_1','valor_2'),
('valor_3','valor_4'),
('valor_5','valor_6');
Dessa maneira, podemos ganhar muito tempo, tanto em tecladas como em performance de inserção.
Em média, 100 linhas inseridas dessa maneira podem ser até 10 vezes mais rápidas que fazendo
inserções de forma individual.
Quando for importar uma quantidade grande de dados, pode ser preferível, em alguns cenários, que
você simplesmente ignore os erros e pule os dados problemáticos, que normalmente interromperiam a
query em função de alguma restrição imposta na tabela. Ex: duplicidade de primary keys. Podemos
ignorar os erros durante a inserção usando o INSERT IGNORE.
Tabela `pessoas`
(4,'Gloria'), -- Sem o IGNORE, essa linha geraria um erro e o INSERT não continuaria.
(5,'Amanda');
-- Pesquisando agora, você verá que a informação duplicada não foi inserida.
Tabela <strong>pessoas</strong>
O importante aqui é lembrar que o INSERT IGNORE vai pular os outros erros silenciosamente também.
Primeiramente, é preciso saber que o auto_increment é uma funcionalidade que todos os bancos de
dados possuem. Ela permite que valores sejam gerados automaticamente cada vez que uma nova linha é
inserida em uma tabela que tem essa restrição ativa. Ao inserir um novo ator na tabela sakila.actor, caso
outros atores ainda não tenham sido inseridos desde que o banco foi restaurado, o próximo valor que
será gerado para actor_id será o valor do último id registrado acrescido de um (201 + 1).
Com isso em mente, a coluna que possui auto_increment é omitida no INSERT, uma vez que o valor já é
gerado automaticamente:
VALUES('Marcelo','Santos');
É possível inserir dados a partir de outra tabela usando INSERT INTO SELECT:
FROM tabelaB
WHERE tabelaB.nome_da_coluna <> 'algumValor'
ORDER BY tabelaB.coluna_de_ordenacao;
Assim, estaríamos extraindo a colunaA e a colunaB da tabelaB e as inserindo na tabelaA, de acordo com
a condição que for passada no WHERE.
É possível usar também SELECT * FROM e copiar todos os dados de todas as colunas de uma tabela para
outra, mas nessa situação a tabelaA e a tabelaB precisam obrigatoriamente possuir a mesma quantidade
de colunas, e os tipos de dados das colunas correspondentes devem ser iguais.
Com essa funcionalidade, é fácil criar tabelas temporárias para testes ou por necessidade. Por exemplo,
para trazer os dados da tabela sakila.staff para a tabela sakila.actor, poderíamos fazer:
Um grande filósofo uma vez disse: "Practice Makes Perfect". Não sabemos quem ele é, mas ele tem
razão! Vamos praticar!
Para saber quais campos são obrigatórios, clique com o botão direito na tabela sakila.staff e selecione
"Table Inspector". Clique na aba "columns" e verifique quais campos aceitam nulos para te guiar.
Lembre-se de que valores que são gerados automaticamente não precisam ser inseridos manualmente.
Boa explorada!
Feito o exercício anterior, vamos agora para o nível 2. Insira 2 funcionários novos em apenas uma
query.
Selecione os 5 primeiros nomes e sobrenomes da tabela sakila.customer e cadastre essas pessoas
como atores na tabela sakila.actor.
Você avisou na recepção que seu nome é Rannveig, mas, quando foi ver em seu documento, foi
registrado como Ravein! "Poxa, será que meu nome é tão difícil assim de se escrever?" Sua sorte é que o
UPDATE te permite alterar valores de uma tabela com base em alguma condição. Vamos resolver isso!
UPDATE sakila.staff
Como foi exibido no código acima, a sintaxe geral para fazer um update é:
UPDATE nome_da_tabela
WHERE alguma_condicao; -- importantíssimo aplicar o WHERE para não alterar a tabela inteira!
Uma curiosidade sobre o UPDATE e o DELETE no MySQL Server é que, por padrão, existe uma
configuração chamada safe updates mode que só vai te permitir executá-los caso eles incluam quais IDs
devem ser modificados. Então, caso você tente fazer a query abaixo, ela não funcionaria por não incluir o
ID.
UPDATE sakila.staff
Para evitar essa restrição, rode o seguinte comando em uma janela de query dentro do MySQL
Workbench sempre que abri-lo para desabilitar essa funcionalidade, antes de executar seus comandos
de UPDATE ou DELETE:
SET SQL_SAFE_UPDATES = 0;
UPDATE sakila.staff
WHERE staff_id = 4;
UPDATE em massa
Por questões de performance, para que apenas uma solicitação de query seja enviada ao servidor,
podemos fazer uma atualização em massa.
UPDATE sakila.actor
SET first_name = (
CASE actor_id WHEN 1 THEN 'JOE' -- se actor_id = 1, alterar first_name para 'JOE'
END);
Você pode ver mais informações sobre como usar o CASEneste link.
Se o comando ORDER BY for usado juntamente com o UPDATE, os resultados serão alterados na ordem
em que forem encontrados.
Se o comando LIMIT for usado em conjunto com o UPDATE, um limite será imposto na quantidade de
resultados que podem ser alterados. Caso contrário, todos os resultados que satisfizerem a condição
serão atualizados.
Veja a sintaxe abaixo. Lembre-se de que os valores entre colchetes ([]) são opcionais:
UPDATE nome_da_tabela
[WHERE condições]
[LIMIT quantidade_resultados];
-- Exemplo:
UPDATE sakila.staff
WHERE active = 1
ORDER BY last_update
LIMIT 2;
Essas são as maneiras mais comuns que o UPDATE pode ser utilizado no dia a dia. Agora está na hora de
praticar!
P.S. Como dito anteriormente, o safe updates mode é habilitado por padrão no MySQL Workbench. Ele
exige que você inclua os IDs dos itens a serem atualizados ou apagados para poder executar o UPDATE
ou o DELETE. Essa camada de segurança é importante em bancos reais executando em ambientes de
produção, mas torna-se inconveniente em ambientes de aprendizado, como é o caso aqui. Como o
banco pode ser apagado e recriado infinitamente, vamos desabilitá-lo nos exercícios. Além disso, esse
modo pode ser habilitado novamente quando necessário.
Rode o seguinte comando em uma janela de query dentro do MySQL Workbench sempre que abri-lo
para desabilitar essa funcionalidade, antes de executar seus comandos UPDATE ou DELETE:
SET SQL_SAFE_UPDATES = 0;
Atualize o primeiro nome de todas as pessoas da tabela sakila.actor que possuem o primeiro nome
"JULIA" para "JULES".
Foi exigido que a categoria "Sci-Fi" seja alterada para "Science Fiction".
Atualize o valor do aluguel para $25 de todos os filmes com duração maior que 100 minutos e que
possuem a classificações "G", "PG" ou "PG-13" e um custo de substituição maior que $20.
Foi determinado pelo setor financeiro que haverá um reajuste em todos os preços dos filmes, com
base em sua duração. Para todos os filmes com duração entre 0 e 100, o valor do aluguel passará a ser
$10,00, e o aluguel dos filmes com duração acima de 100 passará a ser de $20,00.
Como assim, alguém te cadastrou sem você deixar? Vamos dar um DELETE nisso!
Antes de aprender a excluir dados de uma tabela, é importante entender que nem sempre que você
clicar em excluir, em um sistema ou em um site, a informação terá sido de fato excluída do banco de
dados. Em muitos casos, a funcionalidade de "excluir" apenas marcará a informação como inativa ou
excluída, ou algum campo equivalente.
Isso ocorre pela necessidade de seguir normas ou regulamentos sobre disponibilidade e segurança de
dados. Relatórios podem necessitar de informações que já foram "excluídas" ou pode ser necessário
manter logs de uso (históricos de acontecimentos no sistema) de seu software.
-- O WHERE é opcional. Porém, sem ele, todas as linhas da tabela seriam excluídas.
P.S. Novamente, caso o safe update mode esteja habilitado, os comandos DELETE só funcionariam se os
IDs fossem incluídos em suas queries. Para fins de prática, vamos desabilitá-lo.
Rode o seguinte comando em uma janela de query, dentro do MySQL Workbench, sempre que abri-lo,
para desabilitar essa funcionalidade antes de executar seus comandos DELETE:
SET SQL_SAFE_UPDATES = 0;
Meu DELETE não foi permitido...
Caso haja relações entre as tabelas (primary key e foreign keys) e existam restrições aplicadas a elas, ao
executar o DELETE ocorrerá uma ação de acordo com a restrição que tiver sido imposta na criação da
foreign key. Essas restrições podem ser as seguintes:
ON DELETE NO ACTION
ON DELETE RESTRICT
-- Permite a exclusão dos registros da tabela pai, e seta para NULL os registros da tabela filho.
ON DELETE CASCADE
Se tentar rodar essa query, você vai se deparar com o erro exibido na imagem abaixo:
Para conseguir excluir este ator em actors, precisamos primeiro excluir todas as referências a ele na
tabela sakila.film_actor:
Antes de excluir dados que possuem restrições de chave estrangeira, como o exemplo que acabamos de
ver, analise se você realmente deve excluir essa informação do banco de dados e depois, caso precise,
faça de acordo com as restrições que foram impostas durante a criação da tabela. Elas são colocadas lá
para garantir a integridade de seus dados. Se existem restrições, normalmente não faria sentido
simplesmente ignorá-las.
DELETE VS TRUNCATE
Se tem certeza absoluta de que quer excluir os registros de uma tabela de uma maneira mais rápida,
para efeitos de testes ou necessidade, o TRUNCATE é mais rápido que o DELETE. A função principal e
única do TRUNCATE é de limpar (excluir todos os registros) de uma tabela, não sendo possível especificar
o WHERE. Por isso, o TRUNCATE só pode ser usado nesse cenário.
TRUNCATE banco_de_dados.tabela;
Caso precise excluir condicionalmente, usando regras e especificações, use sempre o comando DELETE
juntamente com o WHERE.
Vamos praticar o DELETE
Exclua da tabela film_text todos os registros que possuem a palavra "saga" em suas descrições.
Apague da maneira mais performática possível todos os registros das tabelas film_actor e
film_category.
Inspecione todas as tabelas do banco de dados sakila e analise quais restrições ON DELETE foram
impostas em cada uma. Use o Table Inspector para fazer isso (aba DDL).
Vamos bater um papo sobre SQL? Hora da aula ao vivo! Vamos para o Slack, onde o link estará
disponível.
Exercícios
Os exercícios propostos possuem níveis variáveis de dificuldade. Tente fazer o máximo que conseguir.
Bônus
Para fazer os exercícios a seguir, restaure o backup do banco de dados HR, disponível clicando neste link
com botão direito e escolhendo a opção "Salvar como".
Monte uma query em seu banco local, que você acabou de restaurar, e veja se seu resultado resolve o
desafio.
Caso não consiga resolver os exercícios, consulte as respostas clicando em "Click me to see the
solution" na página do desafio.
Próximo
Sempre que achar necessário, consulte seu Manual para ter mais informações sobre o curso!
Tutoriais
Envie seu feedback (com o link da página) para nós via Slack para nos ajudar a construir juntos o melhor
conteúdo para o seu aprendizado!
#VQV
© Trybe 2020
https://sqlbolt.com/lesson/inserting_rows
https://sqlbolt.com/lesson/updating_rows
https://academy.vertabelo.com/
https://academy.vertabelo.com/course/operating-on-data-in-sql/insert/insert/insert
https://academy.vertabelo.com/course/operating-on-data-in-sql/update/update/update
https://academy.vertabelo.com/course/operating-on-data-in-sql/delete/delete/delete
https://course.betrybe.com/back-end/HR_database_backup.sql
</li>
</li>
</li>
</li>
</li>
</li>
Terceira Parte
Hoje você vai aprender como facilitar MUITO sua vida através das principais funções que lidam com
números, strings, datas e agregação de dados no MySQL.
Isso é importante porque os comandos e funcionalidades que você vai ver hoje te permitirão encontrar
informações estatísticas e temporais sobre seus dados. Além disso, ao saber controlar o fluxo de uma
query utilizando condicionais, você será capaz de tratar diferentes cenários em uma única consulta.
Conteúdos:
Manipulação de strings
Uma das responsabilidades das pessoas que lidam com o registro de informações em um banco de
dados é se certificar que estes dados estão coerentes, normalizados e cadastrados no formato correto. O
MySQL possui algumas funções de manipulação de string que facilitam essas tarefas.
-- então a string será extraída do índice inicial definido, até o seu final
Para fixar melhor, que tal explorar na prática o que cada comando faz? Rode cada um deles no MySQL
Workbench e veja os resultados.
Observe que, apesar de ter usado strings temporárias nos exemplos acima, também é possível fazer
essas operações diretamente nas colunas de uma tabela. Para testar, execute o código abaixo no seu
ambiente local, brinque com as linhas a seguir e depois volte aqui.
Algo importante a se notar sobre strings em SQL é que, diferente de várias linguagens de programação,
no SQL strings são indexadas a partir do índice 1 e não no índice 0. Caso tenha resultados inesperados,
essa pode ser uma das razões.
Agora, vamos fixar os aprendizados com alguns desafios:
Faça uma query que transforme a frase 'Você já ouviu falar do DuckDuckGo?' em 'Você já ouviu falar
do Google?'.
Utilizando uma query, encontre quantos caracteres temos em 'Uma frase qualquer'.
Extraia e retorne a palavra "JavaScript" da frase 'A linguagem JavaScript está entre as mais usadas'.
Por fim, padronize a string 'RUA NORTE 1500, SÃO PAULO, BRASIL' para que suas informações estejam
todas em caixa baixa.
Condicionais
Em linguagens de alto nível como Python, JavaScript e outras, as condicionais são a base para a criação
de algorítimos dinâmicos que se adaptam de acordo com a necessidade do programa. O SQL não fica
para trás nesse quesito, sendo possível nele também usar os principais comandos de controle de fluxo,
como o IF e o CASE.
Para entender como isso pode ser feito, veja os exemplos abaixo:
-- Sintaxe:
FROM pessoas;
SELECT IF(aberto = true, 'Entrada permitida', 'Entrada não permitida')
FROM estabelecimentos;
FROM sakila.customer
LIMIT 20;
Em situações em que é preciso comparar mais de uma condição, é preferível utilizar o CASE.
-- Sintaxe:
SELECT CASE
END;
SELECT
nome,
nivel_acesso,
CASE
END AS nivel_acesso
FROM permissoes_usuario;
first_name,
email,
CASE
END AS valor
FROM sakila.customer
LIMIT 10;
Esse tema é melhor aprendido quebrando a cabeça praticando, então vamos fazer isso.
Usando o IF na tabela sakila.film, exiba o id do filme, o título e uma coluna extra chamada 'conheço o
filme?', em que deve-se avaliar se o nome do filme é 'ACE GOLDFINGER'. Caso seja, exiba "Já assisti esse
filme". Caso contrário, exiba "Não conheço o filme". Não esqueça de usar um alias para renomear a
coluna da condicional.
Usando o CASE na tabela sakila.film, exiba o título, a classificação indicativa (rating) e uma coluna extra
que vamos chamar de 'público alvo', em que classificaremos o filme de acordo com as seguintes siglas:
Se não cair em nenhuma das classificações anteriores: "Proibido para menores de idade".
Para as operações matemáticas mais comuns, podemos usar os operadores matemáticos usuais. Vamos
testar cada um deles?
SELECT 5 + 5;
SELECT 5 - 5;
SELECT 5 * 5;
SELECT 5 / 5;
Podemos, também, usar as colunas diretamente como base para os cálculos, caso necessário.
Divisão de inteiros com DIV e como encontrar seus restos com o MOD
O DIV retorna o resultado inteiro de uma divisão, ignorando as casas decimais de um número. Veja os
exemplos abaixo:
SELECT 10 DIV 3; -- 3
SELECT 10 DIV 2; -- 5
SELECT 14 DIV 3; -- 4
SELECT 13 DIV 2; -- 6
Já o operador MOD retorna o resto de uma divisão como resultado. Por exemplo:
SELECT 10 MOD 3; -- 1
SELECT 10 MOD 2; -- 0
SELECT 14 MOD 3; -- 2
SELECT 13 MOD 2; -- 1
Dica: Números pares são aqueles que podem ser divididos em duas partes iguais. Ou seja, são aqueles
cuja divisão por 2 retorna resto 0.
Monte uma query usando o MOD juntamente com o IF para descobrir se o valor 15 é par ou ímpar.
Chame essa coluna de 'Par ou Ímpar', onde ela pode dizer 'Par' ou 'Impar'.
Temos uma sala de cinema que comporta 220 pessoas. Quantos grupos completos de 12 pessoas
podemos levar ao cinema sem que ninguém fique de fora?
Utilizando o resultado anterior, responda à seguinte pergunta: Temos lugares sobrando? Se sim,
quantos?
Arredondando Valores
SELECT ROUND(10.4925); -- 10
SELECT ROUND(10.5136); -- 11
SELECT CEIL(10.51); -- 11
SELECT CEIL(10.49); -- 11
SELECT CEIL(10.2); -- 11
SELECT FLOOR(10.51); -- 10
SELECT FLOOR(10.49); -- 10
SELECT FLOOR(10.2); -- 10
Para calcular a exponenciação e a raiz quadradas, podemos utilizar as funções POW e SQRT,
respectivamente.
Elevando um número X à potência Y usando a função POW:
SELECT SQRT(9); -- 3
SELECT SQRT(16); -- 4
Para situações em que se faz necessário gerar valores aleatórios, podemos usar a função RAND, em
conjunto com as funções anteriores.
SELECT RAND();
Monte uma query que exiba o valor arredondado de 15.75 com uma precisão de 5 casas decimais.
Estamos com uma média de 39.494 de vendas de camisas por mês. Qual é o valor aproximado para
baixo dessa média?
Temos uma taxa de inscrição de 85.234% no curso de fotografia para iniciantes. Qual é o valor
aproximado para cima dessa média?
Podemos descobrir a diferença em dias entre duas datas usando o DATEDIFF e, a diferença de tempo
entre dois horários usando o TIMEDIFF. Em ambos os casos, o segundo valor é subtraído do primeiro
para calcular o resultado.
E por fim, podemos extrair qualquer parte de uma data de uma coluna:
SELECT DATE(data_cadastro); -- YYYY-MM-DD
Também podemos usar CURRENT_DATE() e NOW() em conjunto com os comandos acima para encontrar
resultados dinâmicos da seguinte maneira:
Monte uma query que exiba a diferença de dias entre '2030-01-20' e hoje.
Existem certos tipos de cálculos que são usados muito frequentemente e não devem ser feitos
manualmente toda vez. Por isso temos as seguintes funções que analisam todos os registros de uma
determinada coluna e retornam um valor depois de comparar e avaliar todos os registros.
Para praticar, vamos encontrar algumas informações sobre os filmes cadastrados em nossa base de
dados.
Os resultados de uma query podem ser agrupados por uma ou mais colunas usando o GROUP BY, o que
faz com que todos registros que têm o mesmo valor para tais colunas sejam exibidos juntos. O GROUP BY
também pode ser usado em conjunto com as funções de agregação que vimos anteriormente.
GROUP BY coluna(s);
Uma das formas como podemos utilizar o GROUP BY é agrupar os registros pelo valor de uma coluna,
exibindo apenas um registro de cada valor, como é feito com a coluna first_name a seguir.
Tendo visto isso, agora vamos explorar como utilizar o GROUP BY em conjunto com as diversas funções
de agregação que foram estudadas até aqui, através alguns exemplos feitos com o nosso banco de dados
sakila.
FROM sakila.film
GROUP BY rating;
FROM sakila.film
GROUP BY rating;
FROM sakila.film
GROUP BY rating;
FROM sakila.film
GROUP by rating;
Vamos praticar
Monte uma query que exiba a quantidade de clientes cadastrados na tabela sakila.customer que estão
ativos e a quantidade que estão inativos.
Monte uma query para a tabela sakila.customer que exiba a quantidade de clientes ativos e inativos
por loja. Os resultados devem conter o ID da loja, o status dos clientes (ativos ou inativos) e a quantidade
de clientes por status.
Monte uma query que exiba a média de duração por classificação indicativa (rating) dos filmes
cadastrados na tabela sakila.film. Os resultados devem ser agrupados pela classificação indicativa e
ordenados da maior média para a menor.
Monte uma query para a tabela sakila.address que exiba o nome do distrito e a quantidade de
endereços registrados nele. Os resultados devem ser ordenados da maior quantidade para a menor.
Podemos usar o HAVING para filtrar resultados agrupados, assim como usamos o SELECT...WHERE para
filtrar resultados individuais.
A query a seguir busca o nome e quantidade de nomes cadastrados na tabela sakila.actor e os agrupa
por quantidade. Por fim, filtramos os resultados agrupados usando o HAVING, para que somente os
nomes que estão cadastrados duas ou mais vezes sejam exibidos.
FROM sakila.actor
GROUP BY first_name
FROM sakila.actor
GROUP BY first_name
HAVING nomes_cadastrados > 2;
FROM sakila.actor
GROUP BY first_name
É importante entender que quando usamos o HAVING estamos filtrando somente os resultados gerados
após o GROUP BY ter sido executado.
Usando a query a seguir, exiba apenas as durações médias que estão entre 115.0 a 121.50. Além disso,
dê um alias (apelido) à coluna gerada por AVG(length), de forma que deixe a query mais legível. Finalize
ordenando os resultados de forma decrescente.
FROM sakila.film
GROUP BY rating;
Usando a query a seguir, exiba apenas os valores de total de substituição de custo que estão acima de
$3950.50. Dê um alias que faça sentido para SUM(replacement_cost), de forma que deixe a query mais
legível. Finalize ordenando os resultados de forma crescente.
FROM sakila.film
GROUP by rating;
Vamos fazer juntos!
Woohoo é isso ae, parabéns por ter finalizado o conteúdo de hoje! Vamos bater um papo agora na aula
ao vivo. O link estará disponível no Slack.
Exercícios
O banco de dados usado como base para os próximos exercícios pode ser restaurado usando este
arquivo SQL.
Leia o exercício;
Verifique a solução voltando no link do exercício e clicando em no link "Click me to see the solution"
do exercício que está fazendo.
Bem vindo de volta! Hoje você vai aprender a utilizar os diferentes tipos de JOIN para juntar dados
relacionados em um banco de dados. Similarmente, vai entender como unir resultados de duas ou mais
queries em apenas uma, através do UNION.
Utilizar LEFT JOIN e RIGHT JOIN para combinar dados de duas ou mais tabelas
Utilizar SELF JOIN para fazer join de uma tabela com ela própria
Todas essas funcionalidades podem ser usadas para diferentes propósitos no seu dia a dia de trabalho,
como a criação de relatórios, criação de novas maneiras de exibir uma informação já cadastrada em uma
tabela e adicionar detalhes a tabelas existentes, entre outras possibilidades.
Conteúdos
O que é um JOIN?
Até o momento, você já criou consultas para filtrar, ordenar, selecionar, alterar, agrupar, inserir e apagar
dados armazenados nas tabelas dos seus bancos de dados. Cada consulta, no entanto, sempre acessava
apenas uma tabela.
Em alguns casos, uma tabela pode não possuir toda a informação necessária. Em função disso, existe a
opção de usar os diversos tipos de JOIN para combinar em um mesmo resultado registros de duas ou
mais tabelas. Esses tipos são: INNER JOIN, LEFT JOIN e RIGHT JOIN, para combinar duas ou mais tabelas e
SELF JOIN, quando uma tabela precisa ser combinada consigo mesma. Você verá detalhes de cada um
desses tipos de JOIN a seguir.
Como foi visto no vídeo, o INNER JOIN permite retornar todos os resultados em que a condição da
cláusula ON for satisfeita. A sintaxe de um INNER JOIN é a seguinte:
FROM tabela1 AS t1
INNER JOIN tabela2 AS t2
ON t1.coluna_em_comum = t2.coluna_em_comum;
O alias AS é usado para apelidar qualquer parte da sua query. Isso ajuda o sistema de banco de dados a
identificar a qual coluna estamos nos referindo, evitando erros de ambiguidade de nome de colunas,
além de tornar suas queries mais concisas e legíveis.
Podemos tornar a query mais legível com um *alias*, além de evitar o erro de ambiquidade de coluna:
```language-sql SELECT a.first_name, a.actor_id, f.actor_id FROM sakila.actor AS a INNER JOIN film_actor
AS f ON a.actor_id = f.actor_id; ``` **OBS.:** A palavra chave `AS` pode ser omitida. Nesse caso, o *alias*
é passado diretamente, após o nome da tabela: ```language-sql SELECT a.first_name, a.actor_id,
f.actor_id FROM sakila.actor a INNER JOIN film_actor f ON a.actor_id = f.actor_id; ```
Sua query é composta de poucas linhas? Então use apenas letras ou a primeira sílaba para representar a
coluna. Por exemplo, "actor" se tornaria "A" ou "act".
Caso esteja montando JOINS com muitas linhas, é recomendado usar um alias mais descritivo para
tornar a leitura e interpretação da query mais simples.
Ok, Linus, it's coding time!
Vamos ver agora alguns desafios para consolidar esse conhecimento sobre o INNER JOIN, utilizando o
banco de dados sakila. Antes de começar a escrever suas queries, identifique quais tabelas contêm as
informações de que você precisa e como elas estão relacionadas.
Monte uma query que exiba o id do ator, nome do ator e id do filme em que ele já atuou usando as
tabelas actor e film_actor.
Use o JOIN para exibir o nome, sobrenome e endereço de cada um dos funcionários do banco. Use as
tabelas staff e address.
Exiba o id do cliente, nome e email dos primeiros 100 clientes, ordenados pelo nome em ordem
decrescente, juntamente com o id do endereço e o nome da rua onde o cliente mora. Essas informações
podem ser encontradas nas tabelas customer e address.
Exiba o nome, email, id do endereço, endereço e distrito dos clientes que moram no distrito da
California e que contêm "rene" em seus nomes. As informações podem ser encontradas nas tabelas
address e customer.
Exiba o nome e a quantidade de endereços dos clientes cadastrados. Ordene seus resultados por
nomes de forma decrescente. Exiba somente os clientes ativos. As informações podem ser encontradas
na tabela address e customer.
Monte uma query que exiba o nome, sobrenome e a média de valor (amount) paga aos funcionários
no ano de 2006. Use as tabelas payment e staff. Os resultados devem estar agrupados pelo nome e
sobrenome do funcionário.
Monte uma query que exiba o id do ator, nome, id do filme e titulo do filme, usando as tabelas actor,
film_actor e film. Dica: você precisará fazer mais de um JOIN na mesma query.
Até o momento, temos produzido resultados apenas quando temos valores correspondentes em ambas
as colunas de referência. Porém, o que devemos fazer quando possivelmente apenas uma das tabelas
possui um valor correspondente existente? É possível que você tenha que usar o LEFT JOIN ou RIGHT
JOIN nessas situações.
Você precisa encontrar um conjunto de registros, mas não tem certeza se uma das colunas de referência
envolvidas possui ou não essa informação. Para que você encontre registros nessa situação, podemos
usar o LEFT JOIN ou RIGHT JOIN. Vamos entender melhor com o vídeo a seguir:
O conceito de JOIN pode levar um certo tempo para ser compreendido. Sendo assim, vá no seu ritmo,
reveja o conteúdo deste dia quantas vezes forem necessárias para compreender bem este conceito.
Pense em perguntas que você gostaria de responder sobre algum de seus bancos de dados que utilizem
dados de mais de uma tabela. Abra o Workbench e tente fazer uma query que as responda.
3 queries e 1 pergunta
Vamos visualizar a diferença entre os 3 joins já vistos até o momento. Rode e analise cada uma das 3
queries a seguir. Busque notar a diferença entre as colunas da direita e da esquerda e a quantidade de
dados retornados em cada query, como foi mostrado no vídeo. Gaste de 2 a 5 minutos aqui e depois
continue.
LEFT JOIN
SELECT
c.customer_id,
c.first_name,
c.last_name,
a.actor_id,
a.first_name,
a.last_name
FROM customer c
ON c.last_name = a.last_name
ORDER BY c.last_name;
RIGHT JOIN
SELECT
c.customer_id,
c.first_name,
c.last_name,
a.actor_id,
a.first_name,
a.last_name
FROM customer c
ON c.last_name = a.last_name
ORDER BY c.last_name;
INNER JOIN
SELECT
c.customer_id,
c.first_name,
c.last_name,
a.actor_id,
a.first_name,
a.last_name
FROM customer c
ON c.last_name = a.last_name
ORDER BY c.last_name;
Notando as diferenças
Depois de ter analisado as queries acima, note que de fato a única diferença entre os 3 joins é a questão
do foco. Vamos explorar essa ideia abaixo.
Quando utilizamos o LEFT JOIN, focamos na tabela da esquerda. São retornados todos os registros da
tabela esquerda e valores correspondentes da tabela da direita, caso existam. Valores que não possuem
correspondentes são exibidos como nulos.
Quando utilizamos o RIGHT JOIN, focamos na tabela da direita. São retornados todos os registros da
tabela direita e valores correspondentes da tabela da esquerda, caso existam. Valores que não possuem
correspondentes são exibidos como nulos.
Você pode ver mais exemplos sobre RIGHT JOIN no W3Schools e no MySQLTutorial.
Finalmente, temos o INNER JOIN, que foca em trazer somente os registros que possuem valores
correspondentes em ambas tabelas.
Novamente, você pode ver uma representação visual do INNER JOIN abaixo:
Até o momento, temos usado mais de uma tabela para analisar dados e gerar informação. No entanto, a
informação a ser analisada pode estar concentrada em apenas uma tabela. Neste cenário, o SELF JOIN
pode ser usado para criar resultado relevantes.
Há certos cenários nos quais faz sentido pesquisar e tirar alguma conclusão analisando apenas uma
única tabela. Os tipos de JOIN que você viu até agora precisam necessariamente que mais de uma tabela
seja incluída em uma query para que um resultado possa ser gerado. O SELF JOIN não possui esse
requisito. Vamos ver a seguir algumas das aplicações do SELF JOIN.
Como foi visto no vídeo acima, podemos fazer pesquisas e comparações dentro da própria tabela através
do SELF JOIN. Lembre-se dessa opção sempre que a informação que você precisa filtrar ou comparar
para encontrar algo estiver em uma única tabela.
Note que um SELF JOIN não é um tipo diferente de JOIN. É apenas um caso em que uma tabela faz join
consigo mesma. Você pode utilzar qualquer dos tipos de JOIN vistos ao realizar um SELF JOIN.
Queremos saber os ids e custos de substituição dos filmes que possuem o mesmo custo de
substituição.
Exiba o titulo e a duração de empréstimo dos filmes que possuem a mesma duração. Exiba apenas os
filmes com a duração de empréstimo entre 2 a 4 dias.
Lembre-se de usar o SELF JOIN em situações em que as informações que estiver buscando estejam
armazenadas em apenas uma tabela.
A seguir, veremos como é possível combinar os resultados de uma query com outra por meio do UNION.
Imagine que temos duas tabelas, morning_events e night_events, e que essas tabelas possuem os
nomes das pessoas que compareceram a esses dois tipos diferentes de eventos. Porém, queremos uma
lista agregada de todas as pessoas que estão cadastradas, independente do tipo de evento em que
compareceram.
Essa situação é um dos cenários que podem ser resolvidos através do UNION. O UNION nos permite unir
os registros de uma tabela com outra, desde que usemos a mesma quantidade de colunas. Vamos
explorar outras possibilidades no vídeo a seguir:
Como foi visto no vídeo, podemos utilizar este comando de duas maneiras: UNION e UNION ALL.
O UNION remove os dados duplicados, enquanto o UNION ALL os mantém. Observe que para usar o
comando corretamente, a mesma quantidade de colunas deve ser utilizada.
Todos os funcionários foram promovidos a atores. Monte uma query que exiba a união da tabela staff
com a tabela actor, exibindo apenas o nome e o sobrenome. Seu resultado não deve excluir nenhum
funcionário ao unir as tabelas.
Monte uma query que una os resultados das tabelas customer e actor, exibindo os nomes que contém
a palavra "tracy" na tabela customer e os que contém "je" na tabela actor. Exiba apenas os resultados
únicos.
Monte uma query que exiba a união dos 5 últimos nomes da tabela actor, o primeiro nome da tabela
staff e 5 nomes a partir da 15ª posição da tabela customer. Não permita que dados repetidos sejam
exibidos. Ordene os resultados em ordem alfabética.
Você quer exibir uma lista paginada com os nomes e sobrenomes de todos os clientes e atores do
banco de dados, em ordem alfabética. Considere que a paginação está sendo feita de 15 em 15
resultados e que você está na 4ª página. Monte uma query que simule esse cenário.
Hoje você teve o seu primeiro contato com o mundo dos JOINS e UNIONS. Por ser um tema extenso e
muito utilizado no dia a dia de desenvolvimento de software, é recomendado que você pratique o
máximo possível.
Vamos bater um papo sobre SQL? Hora da aula ao vivo! Vamos para o Slack, onde o link estará
disponível.
Exercícios
Caso você ainda não tenha um, crie um repositório com o nome Trybe ou algo similar.
Abaixo você vai ver exemplos de como organizar cada exercício em uma branch, com arquivos e commits
específicos para cada exercício. Você deve seguir este padrão para realizar os exercícios a seguir.
$ mkdir -p exercises/21_2
$ cd exercises/21_2
$ pwd
<path_to_your_repo>/exercises/21_2
Crie um arquivo com um nome descritivo para cada exercício. Os arquivos devem estar dentro da pasta
exercises/21_2, mas lembre-se de fazer os commits a partir da pasta raiz do seu projeto!
$ git status
On branch exercises/21.2
modified: exercise_1.html
$ git log
Exercicio 2 - mudando o evento de click para mouseover, tirei o alert e coloquei pra quando clicar
aparecer uma imagem do lado direito da tela
commit c0701d91274c2ac8a29b9a7fbe4302accacf3c78
commit 6835287c44e9ac9cdd459003a7a6b1b1a7700157
Lembre-se que na primeira vez que você for enviar o código para o repositório remoto a branch
exercises/21.2 não vai existir lá.
Então você precisa configurar o remote utilizando a opção --set-upstream (ou -u, que é a forma
abreviada).
Quando terminar os exercícios, seus códigos devem estar todos commitados na branch exercises/21.2,
e disponíveis no repositório remoto do GitHub.
Pra finalizar, crie um Pull Request , adicione uma descrição bem bacana, e envie para a monitoria e/ou
colegas revisarem! 🤜🏼🤛🏼
Agora a prática
Baixe o script chamado 1_build_schema.sql. Copie seu conteúdo, cole-o em uma janela de query
dentro do MySQL Workbench e acrescente as seguintes linhas no início do código:
USE praticando;
Agora que você restaurou o banco de dados praticando, faça os exercícios 1.10 a 1.14.
USE praticando;
Agora que você restaurou o banco de dados praticando, faça os exercícios 2.10, 2.11, 2.12 2.14.
Baixe o script chamado 3_build_schema.sql. Copie seu conteúdo, cole-o em uma janela de query
dentro do MySQL Workbench e acrescente as seguintes linhas no início do código:
USE praticando;
Agora que você restaurou o banco de dados praticando, faça os exercícios 3.7 a 3.10.
Baixe o script chamado 4_build_schema.sql. Copie seu conteúdo, cole-o em uma janela de query
dentro do MySQL Workbench e acrescente as seguintes linhas no início do código:
USE praticando;
Agora que você restaurou o banco de dados praticando, faça os exercícios 4.5 a 4.7.
Exercício 7:
Caso encontre exercícios sobre o NATURAL JOIN, consulte este link para aprender como utilizá-lo.
Para fazer os exercícios da página abaixo, restaure o back-up do banco de dados HR que está disponível
clicando neste link. Em seguida, siga estes passos:
Monte uma query em seu banco local, que você acabou de restaurar, e veja se seu resultado resolve o
desafio.
Caso não consiga resolver os exercícios, consulte as respostas clicando em "Click me to see the
solution" na página do desafio.
Exercício 8:
Usando o banco de dados sakila, pratique o JOIN com os exercícios 6a a 6b deste link. As respostas
podem ser conferidas neste link.
Bônus
Exercício 9:
Para uma lista completa de exercícios, do básico ao avançado, siga as instruções abaixo acessando este
link. Siga os passos descritos nos exercícios 3, 4, 5 e 6 para criar e restaurar o banco de dados.
Como utilizar INNER JOIN, LEFT LEFT e RIGHT JOIN, por Dev Media
https://www.devmedia.com.br/clausulas-inner-join-left-join-e-right-join-no-sql-server/18930
Próximo
Parte
O que vamos aprender?
Olá, bem vindo de volta! Hoje veremos como montar uma query dentro de outra, através de uma
SUBQUERY. Na sequência, vamos verificar se o resultado de uma query existe ou não através do EXISTS.
Por fim, veremos como criar blocos de código reutilizáveis, através da criação de STORED PROCEDURES e
STORED FUNCTIONS.
Utilizar SUBQUERIES
Montar blocos de código SQL reutilizáveis com STORED PROCEDURES e STORED FUNCTIONS
Os conceitos de EXISTS e SUBQUERY são altamente importantes para criar queries cada vez mais
eficientes e dinâmicas.
Isso é viabilizado pelo fato de que esses comandos te permitirem criar blocos de código SQL reutilizáveis,
que podem se comunicar com outros frameworks e linguagens de programação, como NodeJS, C#,
Python, Java e PHP, entre outras.
Conteúdos
Algo a se lembrar é que a subquery não é a única maneira de encontrar resultados de tabelas
relacionadas. Quando se trata de SQL, os JOINs podem ser usados para encontrar os mesmos resultados.
É recomendado tomar a decisão sobre qual opção utilizar (subquery ou JOIN) baseando-se na
performance da sua query.
FROM (
SELECT *
FROM sakila.film
) AS f;
SELECT
address,
district,
SELECT city
FROM sakila.city
) AS city
FROM sakila.address;
Filtrando resultados com WHERE usando como base os dados retornados de uma SUBQUERY.
WHERE city_id in (
SELECT city_id
FROM sakila.city
);
SELECT
first_name,
SELECT address
FROM sakila.address
) AS address
SUBQUERY ou JOIN
Talvez você esteja se perguntando se seria possível resolver as queries anteriores através de um JOIN. De
fato podemos, como é exemplificado a seguir.
Usando SUBQUERY
SELECT
first_name,
SELECT address
FROM sakila.address
) AS address
FROM sakila.customer c
Sabendo disso, como decidir entre as duas abordagens? Decida qual usar através de testes de
performance e, em seguida, por afinidade.
Uma maneira simples de mensurar a performance e decidir sobre qual abordagem utilizar (Execution
Plan)
Diferente da maioria dos problemas que as pessoas desenvolvedoras resolvem, é possível decidir por
queries melhores que outras através da medição do seu custo de execução.
Existem diversas maneiras para mensurar a performance e otimizar queries no MySQL Server. Temos
carreiras inteiras baseadas nisso. Nesta aula, iremos abordar apenas uma delas: o execution plan.
Ele mensura o custo de uma query e exibe o tipo de scan efetuado em cada tabela incluída na query e
seu custo total. Seu uso na prática pode ser visto da seguinte forma:
Tomando como exemplo as duas últimas queries desta página, crie dois novos arquivos SQL no seu
MySQl Workbench. Em um deles, cole a query que utilizamos a solução que se utilizou de SUBQUERY e,
no outro, a que se utilizou de INNER JOIN.
Em seguida, execute uma das queries e depois clique em Execution Plan, como na imagem abaixo, e
observe o valor de "Query Cost". Quanto menor o valor, em comparação com outra versão da query,
melhor a performance. Assim você pode simplesmente escolher a query que tem o menor custo.
Execute os comandos acima e verifique o custo de cada query. Ficou claro que, nesse caso específico, a
SUBQUERY tem uma performance melhor que o JOIN, em razão de ter o custo de query mais baixo.
Os bancos de dados utilizados no vídeo podem ser acessados nos links a seguir.
Após ter assistido à explicação acima, é bom enfatizar aqui que o intuito principal do EXISTS é:
Para mais exemplos sobre como utilizar o EXISTS, recomendamos a seguinte leitura.
Usando o EXISTS na tabela books_lent e books, exiba o id e título dos livros que ainda não foram
emprestados.
Usando o EXISTS na tabela books_lent e books, exiba o id e título dos livros estão atualmente
emprestados e que contem a palavra "lost" no título.
Usando a tabela carsales e customers, exiba apenas o nome dos clientes que ainda não compraram
um carro.
Usando o comando EXISTS em conjunto com JOIN e as tabelas cars, customers e carsales, exiba o
nome do cliente e o modelo do carro de todos os clientes que fizeram compras de carros.
Montando blocos de código SQL reutilizáveis com stored procedures e stored functions
Temos duas maneiras de armazenar blocos de códigos (queries) para serem usados posteriormente no
MySQL:
Stored procedure;
Stored function.
A palavra stored significa armazenado. Como o próprio nome já dá uma dica, o código fica armazenado
no servidor de banco de dados para que possa ser utilizado sem a necessidade de reescrever uma
funcionalidade.
Para tornar a leitura do seu código mais fácil e sua manutenção mais simples, siga o seguinte padrão ao
nomear suas procedures e functions:
-- Verbo + Resultado
ObterTotalDeVendas
ExibirRankMaximo
ObterClienteMaisAtivo
CalcularNivelEngajamento
MontarNomeCompleto
Stored Procedures
Caso queira uma breve introdução, sugerimos assitir o vídeo abaixo. Caso não goste desse tipo de mídia
e/ou queira uma explicação mais detalhada, prossiga com a leitura.
Evita a necessidade de reescrever algo específico para cada linguagem, plataforma ou framework;
Propaga mudanças feitas em uma stored procedure imediatamente para todas as aplicações que a
usam, reduzindo a necessidade de refatorar o código em todos os ambientes que utilizam o banco de
dados.
Viola um dos princípios de separation of concerns, que diz que sua regra de negócio, dados e
apresentação devem estar separados e desacoplados, uma vez que stored procedures podem conter
regras de negócio e ficam armazendas no banco de dados;
1 - Delimiter
A palavra-chave DELIMITER é usada para definir qual símbolo representa o final da declaração da sua
procedure. Aqui estamos usando $$, porem é permitido usar outros símbolos.
O DELIMITER precisa ser usado para que o MySQL não interprete o primeiro ponto e vírgula encontrado
como o final da declaração da sua procedure.
2 - Variáveis
O MySQL possui a funcionalidade de criar e usar variáveis, assim como em outras linguagens de
programação. Essas variáveis também podem ser usadas em procedures.
Para criar variáveis e atribuir valores a elas, faça o seguinte:
SELECT @my_school;
3 - Tipos de dados
Existem vários tipos de dados no MySQL. Eles serão vistos mais a fundo na próxima aula. Contudo, é bom
que você corra o olho no assunto para ter uma noção básica dos tipos de dados existentes antes de
continuar aqui.
DELIMITER ; -- muda o delimitador de volta para ; - o espaço entre DELIMITER e o ';' é necessário
Exemplo: Aqui estamos apenas executando uma busca na tabela actor e exibindo os resultados.
USE sakila;
DELIMITER $$
BEGIN
END $$
DELIMITER ;
-- Como usar:
CALL ShowAllActors();
Para criar procedures com funcionalidades mais elaboradas, podemos passar parâmetros de entrada. Ao
definir um parâmetro do tipo IN, podemos usá-lo e modificá-lo dentro da nossa procedure.
Exemplo: Foi criada uma procedure que recebe como parâmetro uma sílaba (syllable) e busca na tabela
actor todos atores quem contem aquela sílaba no nome.
USE sakila;
DELIMITER $$
BEGIN
SELECT *
FROM sakila.actor
END $$
DELIMITER ;
-- Como usar:
CALL ShowActorsWithSyllable('lope');
Exemplo: Estamos recebendo aqui o título de um filme como valor de entrada e depois buscando dentro
da procedure a duração média de um empréstimo daquele filme. Feito isso, ele é inserido em uma
variável que pode ser usada posteriormente.
USE sakila;
DELIMITER $$
IN film_name VARCHAR(300),
BEGIN
FROM sakila.film
END $$
DELIMITER ;
-- Como usar:
SELECT @media_de_dias;
O IN-OUT deve ser usado quando é necessário que um parâmetro possa ser modificado tanto antes
como durante a execução de uma procedure.
Exemplo: Estamos gerando um novo nome para um filme, usando como base a variável film_name, que
deve ser criada e passada como parâmetro para a procedure. O parâmetro sofrerá alterações dentro da
procedure, podendo ser usado posteriormente com o novo nome.
USE sakila;
DELIMITER $$
BEGIN
SELECT CONCAT('ULTRA ', film_name, ' THE BEST MOVIE OF THE CENTURY')
INTO film_name;
END $$
DELIMITER ;
-- Como usar:
CALL NameGenerator(@movie_title);
SELECT @movie_title;
Para todos os desafios abaixo, certifique-se de que a função possa ser chamada e o resultado dela seja
usado corretamente. Utilize o banco de dados sakila.
Monte uma procedure que exiba os 10 atores mais populares, baseado em sua quantidade de filmes.
Essa procedure não deve receber parâmetros de entrada ou saída e, quando chamada, deve exibir o id
do ator ou atriz e a quantidade de filmes atuados.
Monte uma procedure que receba como parâmetro de entrada o nome da categoria desejada em uma
string e que exiba o id do filme, seu titulo, o id de sua categoria e o nome da categoria selecionada. Use
as tabelas film, film_category e category para montar essa procedure.
Monte uma procedure que receba o email de um cliente como parâmetro de entrada e diga se o
cliente está ou não ativo, através de um parâmetro de saída.
Stored Functions
Na área de programação, temos uma boa prática chamada DRY (Don't Repeat Yourself) que, em resumo,
sugere que você não se repita ou reescreva o mesmo código várias vezes.
Nesse ponto, temos uma das principais ferramentas para combater este problema no SQL: as stored
functions.
Através delas, podemos encapsular nossas queries usadas mais frequentemente dentro de um bloco de
código nomeado e parametrizável.
Caso queira uma breve introdução, sugerimos assitir o vídeo abaixo. Caso não goste desse tipo de mídia
e/ou queira uma explicação mais detalhada, prossiga com a leitura.
Stored functions podem ser executadas com o comando SELECT. Ao criá-las, temos que definir o tipo de
retorno que sua função possui.
READS SQL DATA - Indica para o MySQL que sua função somente lerá dados.
Em muitas situações, sua function estará apenas lendo e retornando dados. Nesses casos, a opção
READS SQL DATA deve ser usada. No entanto, sempre avalie o tipo mais adequado a sua função.
DELIMITER $$
BEGIN
query_sql
RETURN resultado_a_ser_retornado;
END $$
DELIMITER ;
Exemplo: Uma stored function que exibe a quantidade de filmes que um determinado ator ou atriz
atuou:
USE sakila;
DELIMITER $$
BEGIN
SELECT COUNT(*)
FROM sakila.film_actor
RETURN movie_total;
END $$
DELIMITER ;
-- Como usar:
SELECT MoviesWithActor(1);
Exemplo: Uma stored function que exibe o nome completo de um ator ou de uma atriz, dado seu id
como parâmetro:
USE sakila;
DELIMITER $$
BEGIN
FROM sakila.actor
WHERE actor_id = id
LIMIT 1
INTO full_name ;
RETURN full_name;
END $$
DELIMITER ;
SELECT GetFullName(51);
Assim como no caso das fuções de agregação AVG, MIN, MAX e SUM, entre outras, as stored functions
são extremamente úteis e devem ser criadas sempre que percebermos que o mesmo tipo de código está
sendo repetido em vários lugares diferentes.
Isso ajuda a reduzir a quantidade de duplicação de código em seu servidor de banco de dados e deixa
seu código mais legível e limpo, além de contribuir para uma melhor experiência para outras pessoas
desenvolvedoras que possam ter que dar manutenção no seu código.
Crie uma function que, dado o parâmetro de entrada inventory_id, retorna o nome do filme vinculado
ao registro de inventário com esse id.
Crie uma function que receba uma determinada categoria de filme em formato de texto (ex: 'Action',
'Horror') e retorna a quantidade total de filmes registrados nessa categoria.
Functions VS Procedures
ou seja:
Stored Procedures podem ser chamadas através do comando CALL e o retorno de um valor é opcional;
Já as Stored Functions são executadas com o comando SELECT e obrigatoriamente retornam algum
valor.
Ainda restam dúvidas com relação à diferença das duas na prática? Que tal dar uma lida na resposta
mais votada aqui?
Hora da aula ao vivo! Vamos para o Slack, onde o link estará disponível.
Exercícios
Caso você ainda não tenha um, crie um repositório com o nome Trybe ou algo similar.
Abaixo você vai ver exemplos de como organizar cada exercício em uma branch, com arquivos e commits
específicos para cada exercício. Você deve seguir este padrão para realizar os exercícios a seguir.
Crie um diretório exercises e, dentro dele, um diretório 21_3. O caminho completo para o diretório a
partir da raiz do projeto deverá ser exercises/21_3.
$ mkdir -p exercises/21_3
$ cd exercises/21_3
$ pwd
<path_to_your_repo>/exercises/21_3
Crie um arquivo com um nome descritivo para cada exercício. Os arquivos devem estar dentro da pasta
exercises/21_3, mas lembre-se de fazer os commits a partir da pasta raiz do seu projeto!
$ git status
On branch exercises/21.3
Changes not staged for commit:
modified: exercise_1.html
$ git log
Exercicio 2 - mudando o evento de click para mouseover, tirei o alert e coloquei pra quando clicar
aparecer uma imagem do lado direito da tela
commit c0701d91274c2ac8a29b9a7fbe4302accacf3c78
commit 6835287c44e9ac9cdd459003a7a6b1b1a7700157
Então você precisa configurar o remote utilizando a opção --set-upstream (ou -u, que é a forma
abreviada).
Quando terminar os exercícios, seus códigos devem estar todos commitados na branch exercises/21.3,
e disponíveis no repositório remoto do GitHub.
Pra finalizar, crie um Pull Request , adicione uma descrição bem bacana, e envie para a monitoria e/ou
colegas revisarem! 🤜🏼🤛🏼
Agora a prática
Antes de começar, para que você possa fazer os exercícios 1, 2 e 3, veja o passo a passo abaixo.
Baixe o script chamado x_build_schema.sql, onde x é o número do exercício que você está acessando no
momento, copie seu conteúdo, cole em uma janela de query dentro do MySQL Workbench e acrescente
as seguintes linhas no início do código. Em seguida, selecione todo o código e execute-o.
USE betrybe;
O que o código acima está fazendo? A primeira linha cria um banco novo chamado betrybe, caso ele
ainda não exista. Na sequência, o comando USE betrybe determina que todas as tabelas e comandos
que forem executadas a seguir devem usar o banco de dados que acabou de ser criado.
Apesar se ser opcional, caso você não inclua essas duas linhas, todas as tabelas seram inseridas no banco
de dados que estiver ativo no momento, resultando em tabelas soltas em lugares inesperados.
-- LINK: https://en.wikibooks.org/wiki/SQL_Exercises/The_computer_store
CREATE DATABASE IF NOT EXISTS betrybe; -- não esqueça de inserir esta linha
Code INTEGER,
);
Agora que você já executou o passo a passo, vamos focar em revisar os conceitos passados até o
momento, através dos seguintes desafios:
Recursos adicionais(Opcional)
Próximo
Aeee!!! Chegamos ao nosso segundo checkpoint, parabéns! Cada passo que você dá no seu aprendizado
te deixa cada vez mais próximo de um futuro melhor.
Nesse projeto, você vai colocar em prática os novos conceitos de SQL que foram aprendidos ao longo do
bloco 21, o que será feito em um novo banco de dados, para que você possa fixar ainda mais o
conteúdo. Então vamos lá 😀
Para aproveitar todo esse conhecimento que foi passado para você nos últimos dias, vamos trabalhar em
uma nova base de dados, da w3shools.
Talvez você já tenha trabalhado ou praticado neste site. Caso não tenha, fique tranquilo que logo terá a
oportunidade.
Pratique e leve o tempo que for necessário para realmente internalizar os comandos e dicas que foram
passadas até o momento.
O que você viu até aqui já cobre uma grande parte dos comandos que profissionais da área usam no dia
a dia. São também comandos comuns em entrevistas de emprego.
Nesses últimos dias, o foco foi te passar o conhecimento necessário para que você saia do nível básico
no mundo do SQL e comece a entrar em um patamar em que, ao dominar estes conhecimentos, esteja
apto para criar soluções que atendam aos requisitos das muitas oportunidades disponíveis no mercado.
Para fechar o pacote conhecimento SQL, avançaremos ainda mais no próximo bloco, onde você vai
aprender como criar um banco de dados do 0.
Especificação
Organização do seu código. Deixe sempre as palavras-chave em CAIXA ALTA e os nomes de tabelas e
colunas em caixa baixa.
Operações matemáticas
Manipulação de strings
Agrupamento de dados
Filtragem de dados
Subqueries
Stored routines
Leia o arquivo README.md do projeto com atenção para uma explicação detalhada de como
desenvolver e entregar seu projeto.
Entregáveis
Para entregar o seu projeto, você deverá criar um Pull Request para um repositório no GitHub. Consulte
o canal do Slack da turma para obter o endereço do repositório.
Este Pull Request deverá conter a implementação das suas queries SQL, como especificado no
README.md do projeto.
Lembre-se que você pode consultar nosso conteúdo sobre Git & GitHub sempre que quiser!
Proximo
Gabaritos
Agenda
Aulas ao Vivo
Trybe Talks
Glossário
Logout
avatar image
TRYBE
Conteúdos
Exercícios
Recursos adicionais (opcional)
Próximo
Hoje você estará focado em aprender da forma mais sucinta possível todo o processo de como modelar
um banco de dados. Dentro desse processo de modelagem, vamos abordar como idealizar uma
estrutura ideal, tendo em mente um problema que precisa ser resolvido. Será ensinado ainda como
identificar entidades, como montar um diagrama de entidade-relacionamento e como produzir uma
estrutura adequada a partir disso.
A frequência com a qual você interage com um banco de dados está, em muitas das vezes, ligada
diretamente com a sua área de atuação. Entretanto, de que maneira as principais áreas de atuação no
mercado hoje estão ligadas com o conhecimento de banco de dados?
Desenvolvimento de Software - Onde o trabalho de criação de banco de dados e tabelas é feito com
mais frequência, nos momentos iniciais de um novo projeto. Contudo, durante o processo de
desenvolvimento, é natural estar sempre atualizando sistemas e, consequentemente, criando tabelas
para se adequar a novas funcionalidades. Em cargos como esse, o seu foco normalmente estará mais em
criar queries para realizar consultas e gerar relatórios e menos na porção de criação de tabelas e bancos
de dados;
DBA ou Database Administrator - Nessa profissão você estará trabalhando muito mais focado em
todos os aspectos que englobam a criação e manutenção de uma ou mais instâncias de bancos de
dados, sendo comum atuar com diferentes servidores, como SQL Server, PostgresSQL, MySQL, SQLite,
entre outros. Esse profissional deve possuir um conhecimento mais profundo sobre as limitações e
diferenças entre servidores, sintaxe, gerenciamento de memória, instalação de servidores, otimização de
queries e outros aspectos relacionados;
Data Scientist - São profissionais que atuam no campo de Data Science, e seu foco está centrado
principalmente em análise de dados e na capacidade de montar queries de grande complexidade, com o
intuito de extrair algo útil de dentro de uma quantidade enorme de dados, a fim de ser usado para
algum campo de estudo;
Algo comum entre todas essas profissões é a necessidade de saber transformar ideias, problemas ou
situações em um banco de dados.
Portanto, serão providas as ferramentas e o conhecimento necessários para que você possa dar o passo
inicial e, mais tarde, escolher qual área se adequa mais ao seu perfil.
Vamos lá!
Conteúdos
Uma ideia que eventualmente será transformada em um banco de dados começa com uma história ou
problema a ser resolvido. É isso que será coberto hoje: um cenário fictício que precisa ser resolvido e
como ir da idealização para a sua solução.
Suponha que seja necessário criar um banco de dados para armazenar informações sobre um catálogo
de álbuns musicais. As informações a serem armazenadas sobre cada álbum são:
Título;
Preço;
Estilo Musical;
Canções.
Cada álbum também terá um artista, e cada artista pode produzir vários álbuns. As canções devem ter
título e duração (em segundos).
Existem alguns passos a serem seguidos durante a modelagem e criação de um banco de dados. Um
fluxo bastante comum nesse processo consiste em:
Primeiramente você deve identificar as entidades, atributos e relacionamentos com base na descrição do
problema. Porém, antes disso é necessário entender o significado de cada um deles.
Entidades:
São uma representação de algo do mundo real dentro do banco de dados. Elas normalmente
englobam toda uma ideia e são armazenadas em formato de tabelas em um banco de dados.
Antes de expandir o código a seguir: Volte à descrição do problema acima e busque identificar quais
objetos devem se tornar entidades. Depois expanda o código abaixo para verificar.
Atributos:
Os atributos são tudo aquilo que pode ser usado para descrever algo. Por exemplo, uma entidade
pessoa pode ter nome, altura, peso e idade.
Antes de expandir o código a seguir: Considerando a história anterior sobre um catálogo de álbuns
musicais, tente deduzir quais propriedades descrevem cada uma das entidades encontradas
anteriormente.
Relacionamentos:
Os relacionamentos servem para representar como uma entidade deve estar ligada com outra(s) no
banco de dados. Há três tipos de relacionamentos possíveis em um banco de dados, que são:
Nesse tipo de relacionamento, uma linha da Tabela A deve possuir apenas uma linha
correspondente na Tabela B e vice-versa. Veja o exemplo abaixo:
Esse é um dos tipos mais comuns de relacionamento. Em cenários assim, uma linha na Tabela A
pode ter várias linhas correspondentes na Tabela B, mas uma linha da Tabela B só pode possuir uma
linha correspondente na Tabela A. Veja o exemplo abaixo:
Nesse exemplo, uma categoria pode estar ligada a vários livros, embora um livro deva possuir
apenas uma categoria.
O relacionamento muitos para muitos acontece quando uma linha na Tabela A pode possuir muitas
linhas correspondentes na Tabela B e vice-versa. Veja o exemplo abaixo:
Esse tipo de relacionamento pode ser visto também como dois relacionamentos um para muitos
ligados por uma tabela intermediária, como é o caso da tabela filme_ator. Pode-se chamar essa tabela
intermediária de tabela de junção. Ela é usada para guardar informações de como as tabelas se
relacionam entre si.
Desta maneira, quando se quer demonstrar que um filme pode possuir vários atores e também que
os atores podem atuar em vários filmes, surge a necessidade de um relacionamento muitos para muitos.
Antes de expandir o código a seguir: Volte à estrutura de tabelas do Catálogo de Álbuns e tente
identificar quais tipos de relacionamentos existem entre as tabelas. Escreva-os em algum lugar e depois
expanda abaixo para ver os relacionamentos. Praticar essa habilidade é crucial.
`Ver Relacionamentos`
Existem diversas ferramentas para modelar os relacionamentos em um banco de dados. Hoje será usada
a draw.io para criar os modelos. Você pode aprender como utilizar essa ferramenta assistindo a este
vídeo.
Agora é preciso montar um diagrama de relacionamento básico que demonstra como uma entidade é
relacionada com a outra, usando o modelo EntidadeA + verbo + EntidadeB.
Considerando as entidades Álbum, Artista, Estilo Musical e Canção, foi construído o seguinte diagrama:
O que você deve fazer quando estiver construindo seu próprio banco de dados é entender quantas vezes
uma entidade pode se relacionar com uma outra, para, a partir disso, você poder criar esse primeiro
diagrama, como o do exemplo acima, que mostra como as entidades estão relacionadas entre si.
Para diagramas ER mais detalhados, deve-se incluir o nome das tabelas, suas chaves primárias e
estrangeiras, suas colunas e seus relacionamentos.
Curiosidade: Por questão de convenções e boas práticas na criação de tabelas, não serão usados acentos
ou espaços entre os nomes das tabelas.
Lembre-se: Existem várias maneiras de se modelar um banco de dados. Então, caso pense diferente do
modelo abaixo, entenda que existem diversas formas de se resolver um mesmo problema.
As tabelas Artista e Album possuem um relacionamento de um para muitos (1..N), em que um artista
pode possuir um ou mais álbuns.
A tabela Album possui um relacionamento de um para muitos com a tabela Cancao, uma vez que um
álbum pode conter várias canções.
A tabela EstiloMusical também possui um relacionamento de um para muitos com a tabela Album,
uma vez que um estilo musical pode estar contido em vários álbuns.
A ideia de um diagrama ER é prover uma representação gráfica para a estrutura de seu banco de dados,
descrevendo suas entidades com seus atributos e como elas se relacionam. Essa visualização pode te
ajudar tanto a criar e modelar seu banco de dados quanto a entender se sua modelagem precisa ser
alterada ou se houve algum erro ao pensar na organização de suas entidades. Com esse diagrama você
consegue pensar um pouco mais antes de começar a escrever as queries para criar as tabelas.
Agora que você já tem um diagrama que representa as tabelas que precisam ser criadas, você já pode
botar a mão no código.
Ao lidar com a criação e gerenciamento de um banco de dados, você encontrará os seguintes comandos:
SHOW DATABASES;
-- Define o banco de dados escolhido como ativo.
USE nome_do_banco_de_dados;
Os comandos CREATE DATABASE ou CREATE SCHEMA fazem a mesma coisa, no entanto eles
normalmente são utilizados em conjunto com o comando IF NOT EXISTS. Essa verificação é feita para
evitar a tentativa de criar um banco de dados duplicado, o que ocasionaria um erro.
Considerando o problema que precisa ser resolvido, hora de nomear o banco de dados de albuns.
Talvez você já tenha notado que, até agora, todas as queries têm sido prefixadas ou precedidas do nome
do banco de dados, como, por exemplo:
USE sakila;
Com o banco de dados albuns criado, resta apenas o quarto passo, pelo qual serão criadas as tabelas.
Hora de assistir ao vídeo abaixo, para escolher melhor o tipo de dados durante a criação de uma
tabela.
No vídeo abaixo você vai entender, em menos de 8 minutos, o que são primary key e foreign key.
Hora de aprender como criar tabelas enquanto são montadas as quatro tabelas do banco de dados
albuns neste vídeo.
Resumão
Hoje você teve a oportunidade de vivenciar as seguintes etapas, necessárias para dar vida a um banco de
dados:
Após ter visto todo o processo de como sair de um problema e chegar até a criação de um banco de
dados, é preciso um certo tempo para internalizar esse conteúdo. Com isso em mente, segue a proposta:
Com o intuito de te dar mais tempo para absorver o material de hoje, tente refazer o banco de dados
albuns, caso já o tenha criado no decorrer da aula de hoje. Então, apague o banco de dados e recarregue
a página para que as respostas sobre como criar o banco de dados e tabelas não estejam visíveis e
expandidas.
Tente, com a ajuda do material de hoje, criar o diagrama e o banco novamente por conta própria, sem
olhar as respostas, que estão encapsuladas.
Blocos de respostas
É crucial que você tente chegar às suas próprias conclusões após assistir a este conteúdo. Somente assim
você terá uma chance melhor de absorver esse material.
Vamos bater um papo sobre SQL? Hora da aula ao vivo! Vamos para o Slack, onde o link estará
disponível.
Exercícios
Caso você ainda não tenha um, crie um repositório com o nome Trybe ou algo similar.
Abaixo você vai ver exemplos de como organizar cada exercício em uma branch, com arquivos e commits
específicos para cada exercício. Você deve seguir este padrão para realizar os exercícios a seguir.
Crie um diretório exercises e, dentro dele, um diretório 22_1. O caminho completo para o diretório a
partir da raiz do projeto deverá ser exercises/22_1.
$ mkdir -p exercises/22_1
$ cd exercises/22_1
$ pwd
<path_to_your_repo>/exercises/22_1
Crie um arquivo com um nome descritivo para cada exercício. Os arquivos devem estar dentro da pasta
exercises/22_1, mas lembre-se de fazer os commits a partir da pasta raiz do seu projeto!
$ git status
On branch exercises/22.1
modified: exercise_1.html
$ git log
Exercicio 2 - mudando o evento de click para mouseover, tirei o alert e coloquei pra quando clicar
aparecer uma imagem do lado direito da tela
commit c0701d91274c2ac8a29b9a7fbe4302accacf3c78
commit 6835287c44e9ac9cdd459003a7a6b1b1a7700157
Lembre-se que na primeira vez que você for enviar o código para o repositório remoto a branch
exercises/22.1 não vai existir lá.
Então você precisa configurar o remote utilizando a opção --set-upstream (ou -u, que é a forma
abreviada).
Quando terminar os exercícios, seus códigos devem estar todos commitados na branch exercises/22.1,
e disponíveis no repositório remoto do GitHub.
Pra finalizar, crie um Pull Request , adicione uma descrição bem bacana, e envie para a monitoria e/ou
colegas revisarem! 🤜🏼🤛🏼
Agora, a prática:
Caso não tenha feito ainda, refaça o banco de dados albuns por conta própria, como está descrito na
seção "Hora de mexer os dedos".
Um zoológico precisa de um banco de dados para armazenar informações sobre os seus animais. As
informações a serem armazenadas sobre cada animal são:
Nome;
Espécie;
Sexo;
Idade;
Localização.
Cada animal também possui um cuidador, e cada cuidador pode ser responsável por mais de um
animal. Além disso cada cuidador possui um gerente, sendo que cada gerente pode ser responsável por
mais de um cuidador.
Siga os passos aprendidos no dia de hoje para modelar essa base de dados.
Modelo ER e Diagrama ER
Próximo
Tutoriais
Envie seu feedback (com o link da página) para nós via Slack para nos ajudar a construir juntos o melhor
conteúdo para o seu aprendizado!
#VQV
© Trybe 2020
https://www.sanfoundry.com/sql-mcqs-mysql-datatypes-1/
https://www.sanfoundry.com/sql-mcqs-mysql-datatypes-2/
https://www.devmedia.com.br/modelo-entidade-relacionamento-mer-e-diagrama-entidade-
relacionamento-der/14332
https://drawio-app.com/entity-relationship-diagram-erd/
https://www.w3schools.com/sql/sql_datatypes.asp
https://www.mysqltutorial.org/mysql-data-types.aspx
https://www.percona.com/live/17/sites/default/files/slides/michael-benshoof-schema%20best-
practices.pdf
Normalização
https://medium.com/@diegobmachado/normaliza%C3%A7%C3%A3o-em-banco-de-dados-
5647cdf84a12
https://www.luis.blog.br/normalizacao-de-dados-e-as-formas-normais.html
Transformando Parte 2
https://www.w3resource.com/mysql/creating-table-advance/create-index.php
https://www.w3resource.com/mysql/mysql-views.php
https://pt.wikipedia.org/wiki/Integridade_referencial
Esperamos que você tenha se divertido, quebrado muito a cabeça e, o mais importante, aprendido
bastante sobre a importância e o impacto que o conhecimento de SQL tem na carreira de uma pessoa na
nossa área.
Você receberá um clone simplificado do banco de dados da Spotify. Porém ele não estará normalizado, e
sua missão será de normalizar a estrutura que lhe for passada.
O processo de normalização é algo que ajuda a dar mais credibilidade a um profissional que atua com
estruturas de banco de dados diariamente. Estruturas normalizadas reduzem erros, diminuem a
redundância e nos permitem garantir uma maior integridade de dados.
Especificação
<strong>1ª, 2ª e 3ª Formas Normais procurando um banco fora das normas no servidor da frança para
enquadrar</strong>
As queries que você desenvolver devem retornar exatamente a quantidade de colunas e registros
esperados, dentro do que foi pedido;
Organização do seu código. Deixe sempre as palavras-chave em CAIXA ALTA e os nomes de tabelas e
colunas em caixa baixa.
Identificar modificações necessárias para que suas tabelas estejam adequadamente na 1ª, 2ª e 3ª
Forma Normais.
Criar um banco de dados a partir de uma planilha que contém tabelas e dados.
Queries que passam pelos principais comandos SQL vistos até o momento.
Leia o arquivo README.md do projeto com atenção para uma explicação detalhada de como
desenvolver e entregar seu projeto.
Entregáveis
Para entregar o seu projeto, você deverá criar um Pull Request para um repositório no GitHub. Consulte
o canal do Slack da turma para obter o endereço do repositório.
Este Pull Request deverá conter a implementação das suas queries SQL, como especificado no
README.md do projeto.
Lembre-se: você pode consultar nosso conteúdo sobre Git & GitHub sempre que quiser!