Conhecendo a importância da linguagem SQL para implementar um modelo relacional; entendendo a criação de esquema e tabelas; aprendendo como alterar tabelas para adicionar restrições e estabelecer a integridade referencial; definindo chaves primária e estrangeira em uma tabela; criando filtros para obter informações específicas; deletando e atualizando informações com SQL; realizando consultas no banco de dados; compreendendo a junção entre tabelas; e usando funções de agregação para trazer métricas.
- Introdução e instalação
- Esquemas e Tabelas
- Inserindo dados
- Consultando e alterando os dados
- Unindo tabelas
Saiba mais sobre o curso aqui ou acompanhe minhas anotações abaixo. ⬇️
SQL é uma sigla em inglês para Structured Query Language que pode ser livremente traduzida para Linguagem de Consulta Estruturada e é uma linguagem padrão para trabalhar com bancos de dados relacionais.
Leia mais aqui.
Para trabalhar com modelos de dados estruturados, o SQL juntamente com o modelo relacional prevalece. Contudo, para dados não-estruturados o NoSQL é a melhor alternativa.
- SGBD utilizado no curso: MySQL
Esquemas são grupos (coleções) de tabelas relacionadas. São estruturas lógicas utilizadas para armazenar os dados em um banco de dados. Esquemas definem os objetos e atributos do banco. - Bóson Treinamentos
Antes de criar as tabelas de um banco, é necessário criar um esquema
. Nele serão armazenadas todas as tabelas e configurações da base de dados.
Criando um esquema:
CREATE SCHEMA cdl;
Criando uma tabela:
Para criar uma tabela é preciso já ter um esquema e definir que ele será utilizado para armazenar a tabela criada. A tabela recebe colunas e atributos que caracterizam sua funcionalidade no banco.
- Números são identificados como
INT
- Textos são identificados como
VARCHAR
- Preços são identificados como
DECIMAL
Além disso, colunas podem ou não ser nulas e isso é definido na criação da tabela. O argumento NOT NULL
define que ao cadastrar um livro, todas as informações devem ser preenchidas. Por fim, a tabela recebe uma chave primária que fará relação com outras tabelas do banco.
USE cdl;
CREATE TABLE livros (
cod_livro INT NOT NULL,
nome_livro VARCHAR(100) NOT NULL,
autoria VARCHAR(100) NOT NULL,
editora VARCHAR(100) NOT NULL,
categoria VARCHAR(100) NOT NULL,
preco DECIMAL(5, 2) NOT NULL,
PRIMARY KEY (cod_livro)
);
Categoria | Descrição | Exemplo | Comando |
---|---|---|---|
Numéricos exatos | Números inteiros e decimais | 9 é inteiro e 9.78 é decimal | int, smallint, decimal, numeric |
Numéricos aproximados | Números de ponto flutuante | 7.90 é float | float, real, double precision |
Cadeias de caracteres | Textos de tamanhos fixos e variáveis | “modelagem” é char(9) | char(n), varchar(n) |
Valores lógicos | Verdadeiro ou falso | True é verdadeiro | filtro de comparação |
Data | Datas, dias, mês, anos | 26-02-2023 é DD-MM-YYYY | date |
Tempo | Horas, minutos, segundos | 10:59:13 é HH:MM:SS | timestamp |
Todas as tabelas foram criadas, mas ainda não existe relação entre elas. Para isso, é necessário criar uma chave estrangeira. É possível fazer isso alterando a tabela, adicionando a chave em questão e referenciando a tabela relacionada. Além disso, pode-se adicionar características para manter a integridade dos dados no ato da alteração das tabelas.
Alterando uma tabela:
ALTER TABLE estoque ADD CONSTRAINT fk_estoque_livros
FOREIGN KEY (cod_livro)
REFERENCES livros (cod_livro)
ON DELETE NO ACTION
ON UPDATE NO ACTION
Para estabelecer a relação entre duas tabelas já criadas é preciso alterar uma tabela definindo o campo que será a chave estrangeira e finalizando fazendo referência ao campo de outra tabela.
ALTER TABLE
alterar uma tabelaADD CONSTRAINT
adiciona uma restrição de chave para relacionar duas tabelasFOREIGN KEY
chave estrangeiraREFERENCES
indica a tabela de onde vem a chave estrageiraON DELETE
ao excluir...ON UPDATE
ao atualizar...NO ACTION
impede exclusão ou atualização caso ainda tenha dados daquele registro em outra tabela.
Os números 1, 2 e 3 indicam que existem relações entre as tabelas.
Para adicionar informações nas tabelas, ou seja, criar linhas para as colunas definidas anteriormente, deve-se utilizar o comando INSERT INTO ... VALUES (...)
em que, nos três pontinhos, coloca-se o nome da tabela e os dados de cada coluna, respectivamente.
Inserindo dados:
INSERT INTO livros VALUES (
1,
"Percy Jackson e o Ladrão de Raios",
"Rick Riordan",
"Intríseca",
"Aventura",
40.90
);
Cada valor acima, separado por vírgula, corresponde a uma coluna da tabela. Ao executar o código, têm-se:
cod_livro: 1
nome_livro: Percy Jackson e o Ladrão de Raios
autoria: Rick Riordan
editora: Intríseca
categoria: Aventura
preco: 40.90
Lembrando que o comando NOT NULL
impede valores vazios, então todos os dados precisam ser definidos ou será retornado um erro na execução do código.
Os registros das tabelas podem ser inseridos de várias formas. A forma manual se divide em duas partes: item por item ou um conjunto de itens. Os itens podem ser adicionados fora de ordem também, contudo é preciso indicar a que coluna se refere o texto. A forma automática é feita através do upload de um arquivo, com um padrão similar ao da tabela existente.
-- Inserindo item por item
INSERT INTO livros VALUES
(2, "A volta ao mundo em 80 dias", "Júlio Verne", "Principis", "Aventura", 18.75);
INSERT INTO livros VALUES
(3, "O Cortiço", "Aluísio de Azevedo", "Principis", "Romance", 21.90);
INSERT INTO livros VALUES
(4, "Dom Casmurro", "Machado de Assis", "Principis", "Ficção", 16.00);
-- Inserindo vários itens de vez
INSERT INTO livros VALUES
(2, "A volta ao mundo em 80 dias", "Júlio Verne", "Principis", "Aventura", 18.75),
(3, "O Cortiço", "Aluísio de Azevedo", "Principis", "Romance", 21.90),
(4, "Dom Casmurro", "Machado de Assis", "Principis", "Ficção", 16.00);
-- Inserindo itens desordenados
INSERT INTO livros (categoria, autoria, nome_livro, editora, cod_livro, preco)
VALUES ("Biografia", "Anne Frank", "O Diário de Anne Frank", "Record", 10, 40.40);
-- Inserindo vários itens desordenados
INSERT INTO livros
(categoria, autoria, nome_livro, editora, cod_livro, preco)
VALUES
("Biografia", "Malala Yousafzai", "Eu sou Malala", "Companhia das Letras", 11, 33.53),
("Biografia", "Michelle Obama" , "Minha história", "Objetiva", 12, 40.99);
Caso seja necessário excluir uma tabela, isso pode ser feito através do comando DROP TABLE tabela
. Lembrando que é necessário desativa e reativar as restrições de chave estrangeira para realizar a exclusão, com:
SET FOREIGN_KEY_CHECKS = 0; -- desativa
SET FOREIGN_KEY_CHECKS = 1; -- ativa
A consulta dos dados inseridos é feita a partir do comando SELECT
juntamente com o comando FROM
. Isso quer dizer que para realizar a consulta é preciso indicar o que será mostrado e de onde o dado vem.
Selecionando dados:
-- O asterisco faz com que a consulta traga todos os dados da tabela
SELECT * FROM livros;
-- Indicando o nome da coluna, apenas os registros dela serão mostrados
SELECT nome_livro FROM livros;
-- O comando AS renomeia uma coluna para especificar melhor o conteúdo dela
SELECT cod_livro AS "Código do livro" FROM livros;
Os filtros em SQL são utilizados para restringir os dados que serão mostrados nas consultas. O filtro é feito com o comando WHERE
e é necessário dizer a coluna em que o dado será filtrado e que valor receberá o filtro.
Filtrando dados:
-- Filtro simples
SELECT * FROM livros WHERE categoria = "Biografia";
-- Filtro composto
SELECT * FROM livros WHERE categoria = "Romance" AND preco < 48;
-- Filtro inverso
SELECT * FROM livros WHERE categoria = "Ficção" AND NOT editora = "Principis";
-- Filtro múltiplo
SELECT * FROM livros WHERE editora = "Principis" AND (categoria = "Aventura" OR categoria = "Ficção");
O filtro pode ser utilizando juntamente com outros comandos que criam operações nas consultas:
AND
adiciona um segundo filtro na consultaOR
compara itens e traz apenas um delesNOT
exclui um item ao realizar a consultaLIKE
retorna o filtro com parte do texto (veja mais aqui)
O comando LIKE
pode utilizar o símbolo de %
para substituir qualquer valor na consulta, antes ou após uma letra. Por exemplo: Em uma lista de nomes de cidades, filtra-se apenas as que começam com a letra A.
SELECT cidade FROM * mapa WHERE cidade LIKE "A%"
O comando DISTINCT
é utilizado logo após o select para especificar que não serão mostrados valores duplicados. Isso quer dizer que apenas valores únicos, distintos serão consultados. É outra forma de filtrar dados, podendo ser utilizado com ou sem o where.
Utilizando o distinct:
SELECT DISTINCT * FROM vendas WHERE cod_vendedor = 1 ORDER BY cod_livro;
Além de todos os filtros e operações, já vistos, é possível também ordenar o resultado pelo nome da coluna ou pelo índice dela na consulta com o comando ORDER BY
.
Um dos comandos que requer cuidado em sua utilização é o DELETE
. Cuidado, pois caso não seja definido o que se quer deletar, ele pode acabar apagando toda uma tabela. Então é importante lembrar de não usar delete sem where.
Deletando dados:
-- Deleta o livro com código 8 da tabela
DELETE FROM livros WHERE cod_livro = 8;
Já o comando UPDATE
serve para realizar alterações mais específicas. Juntamente com o SET
, ele pode ser utilizado para modificar um único valor, uma célula da tabela.
Atualizando dados:
-- Multiplica o preço por 9% para realizar um desconto no valor dos livros
UPDATE livros SET preco = 0.9 * preco;
O filtro WHERE
pode ser utilizando para filtrar dados de uma tabela que também está em outra tabela, utilizando a coluna que relaciona ambas. Geralmente, a partir de uma chave primária/estrangeira. Também é possível agrupar o resultado para obter dados únicos na consulta.
-- Filtrando as vendas por vendedor e a quantidade vendida por cada um
SELECT vendas.cod_vendedor, vendedor.nome_vendedor, vendas.qtd_vendida
FROM vendas, vendedor WHERE vendas.cod_vendedor = vendedor.cod_vendedor;
-- # Filtrando as vendas por vendedor e agrupando pela soma da quantidade vendida
SELECT vendas.cod_vendedor, vendedor.nome_vendedor, SUM(vendas.qtd_vendida)
FROM vendas, vendedor WHERE vendas.cod_vendedor = vendedor.cod_vendedor
GROUP BY vendas.cod_vendedor;
Pode-se reduzir consultas ao dar um apelido (alias) para as tabelas. Esse comando já foi visto antes para renomear uma coluna. Utilizando AS
e identificando a tabela com uma sigla, o código é reduzido. Veja mais aqui.
Unindo dados filtrados:
-- O mesmo filtro acima, com o alias nas tabelas
SELECT vds.cod_vendedor, vdd.nome_vendedor, SUM(vds.qtd_vendida)
FROM vendas AS vds, vendedor AS vdd
WHERE vds.cod_vendedor = vdd.cod_vendedor
GROUP BY vds.cod_vendedor;
Outra forma de unir tabelas, mais comumente usado, é o comando INNER JOIN
. Ao consultar um dado em uma tabela, pode-se chamar outra tabela para complementar a consulta, sem perda de dados. Para realizar a junção, basta substituir a vírgula entre as tabelas no from, pelo comando inner join e o where pelo comando on, veja:
Unindo dados semelhantes:
SELECT vds.cod_vendedor, vdd.nome_vendedor, SUM(vds.qtd_vendida)
FROM vendas vds INNER JOIN vendedor vdd
ON vds.cod_vendedor = vdd.cod_vendedor
GROUP BY vds.cod_vendedor;
O comando `AS` é opcional ao renomear tabelas, mas fica visualmente melhor de se entender.
Além do SUM
existem outras funções de agração que são utilizadas para resumir dados de uma tabela.
MAX
a partir de um conjunto de valores é retornado o maior entre eles;MIN
analisa um grupo de valores e retorna o menor entre eles;SUM
calcula o somatório dos valores de um campo específico;AVG
realiza a média aritmética dos valores de uma determinada coluna;COUNT
contabiliza a quantidade de linhas selecionadas.
Utilizando funções de agregação:
SELECT MAX(QTD_VENDIDA) FROM VENDAS;
SELECT MAX(QTD_VENDIDA) FROM VENDAS
GROUP BY(ID_VENDEDOR);
O INNER JOIN
é uma interseção de dados. O join é similar aos conjuntos, sendo o inner a interseção. Há ainda outras formas de se unir dados como conjuntos. O left e o right são uniões em que os dados de uma das tabelas será mostrado em sua totalidade, enquanto os dados da outra tabela serão filtrados.
Unindo dados específicos
-- Trazendo a lista de livros que foram vendidos e as quantidades
SELECT livros.nome_livro, vendas.qtd_vendida
FROM livros LEFT JOIN vendas
ON livros.cod_livro = vendas.cod_livro;
-- Adicionando o where para trazer os livros que não foram vendidos
SELECT livros.nome_livro, vendas.qtd_vendida
FROM livros LEFT JOIN vendas
ON livros.cod_livro = vendas.cod_livro
WHERE vendas.qtd_vendida IS NULL;
Quando temos informações em diferentes tabelas e queremos reunir uma única consulta é comum fazer junção entre tabelas. Para explicar a diferença entre os famosos Joins, é bem comum representarmos por Diagrama de Venn, onde cada círculo (conjunto) representa uma tabela do nosso modelo relacional.
Outros exemplos com join pode ser vistos aqui.
⬆️ Voltar ao topo ⬆️