Aula de SQL (MySQL)
Introdução ao SQL
SQL (Structured Query Language, Linguagem de Consulta Estruturada) é a linguagem padrão para
bancos de dados relacionais. Comandos SQL são usados para definir e manipular dados em tabelas. Em
geral, consultas para recuperar dados usam o comando SELECT 1 . Por exemplo, podemos criar um
banco de dados e usá-lo com:
CREATE DATABASE meus_dados;
USE meus_dados;
(como em 2 ). Em seguida definimos tabelas com DDL (Data Definition Language), como CREATE
TABLE . Por exemplo:
CREATE TABLE pessoas (
id INT PRIMARY KEY AUTO_INCREMENT,
nome VARCHAR(100),
email VARCHAR(100)
);
Este comando cria uma tabela chamada pessoas com colunas id , nome e email . Podemos
alterar ( ALTER TABLE ) ou apagar ( DROP TABLE ) estruturas de tabelas quando necessário.
Comandos DML básicos (CRUD)
Para inserir dados usamos INSERT , para atualizar usamos UPDATE , e para deletar usamos
DELETE (sempre com WHERE para evitar apagar tudo 3 4 ). Exemplos práticos:
• INSERT: adiciona linhas. Exemplo em uma tabela clientes :
INSERT INTO clientes (nome, email)
VALUES ('João', 'joao@exemplo.com');
Veja que listamos colunas e então os valores correspondentes 5 . Se a tabela tem campo
AUTO_INCREMENT (como id ), não precisamos inserir ele manualmente 6 .
• UPDATE: modifica registros. Exemplo alterando o email:
1
UPDATE clientes
SET email = 'novoemail@exemplo.com'
WHERE id = 1;
Sem WHERE , o UPDATE mudaria todos os registros! Por isso sempre especifique quais linhas
atualizar 7 .
• DELETE: remove registros. Exemplo:
DELETE FROM clientes
WHERE id = 1;
Isso apaga apenas o cliente com id = 1 . Sem o WHERE , apagaria tudo 4 .
Comando SELECT – Recuperando dados
O comando SELECT é a base das consultas. Sua sintaxe básica é:
SELECT colunas FROM tabela WHERE condição;
Onde colunas são os campos a retornar e tabela é onde buscar. Por exemplo, para mostrar todos
os nomes na tabela pessoas :
SELECT nome FROM pessoas;
Isso retornará a coluna nome de todos os registros 8 . Podemos selecionar várias colunas separadas
por vírgula:
SELECT nome, email FROM pessoas;
Assim o resultado terá duas colunas. Para retornar todas as colunas usamos * :
SELECT * FROM pessoas;
Isso é equivalente a listar cada coluna manualmente 9 .
Filtros com WHERE
Para filtrar registros usamos WHERE . Por exemplo, para mostrar apenas pessoas de uma certa cidade:
SELECT nome FROM pessoas
WHERE cidade = 'São Paulo';
2
Neste caso, só virão linhas em que cidade = 'São Paulo' . A cláusula WHERE elimina as linhas que
não atendem à condição 10 . Em WHERE usamos operadores de comparação padrão: = , != (ou
<> ), < , > , <= , >= , e os especiais BETWEEN , IN , LIKE , etc. Por exemplo: - LIKE : busca por
padrão em texto. % representa qualquer sequência.
SELECT nome FROM pessoas
WHERE email LIKE '%@dominio.com';
Retorna nomes cujos emails terminam com @dominio.com 11 .
- IN : testa se o valor está em um conjunto.
SELECT * FROM pedidos
WHERE status IN ('pendente', 'enviado');
- BETWEEN : intervalo numérico ou de datas.
SELECT * FROM vendas
WHERE valor BETWEEN 100 AND 200;
- NULL: para checar nulos: WHERE coluna IS NULL (ou IS NOT NULL ).
Também podemos atribuir alias (apelidos) às colunas ou tabelas para simplificar. Por exemplo:
SELECT nome AS cliente, email AS contato
FROM pessoas AS p;
Isso fará as colunas aparecerem como “cliente” e “contato” no resultado 12 . O alias p para a tabela
pessoas permite escrever p.nome .
Ordenação (ORDER BY) e Limite (LIMIT)
Para ordenar resultados, use ORDER BY . Por padrão é crescente; para decrescente adiciona-se DESC .
Exemplo:
SELECT nome, data_nascimento
FROM pessoas
ORDER BY data_nascimento DESC;
Isso lista as pessoas da mais velha para a mais nova 13 . Podemos ordenar por múltiplas colunas (e.g.
ORDER BY coluna1 ASC, coluna2 DESC ). Em MySQL, podemos usar LIMIT n para pegar apenas
as primeiras n linhas:
SELECT * FROM pessoas
ORDER BY nome
LIMIT 10;
3
Isso traria apenas os 10 primeiros nomes em ordem alfabética.
Agregação e GROUP BY
SQL permite funções de agregação para cálculos sobre colunas: COUNT() , SUM() , AVG() ,
MIN() , MAX() , etc. Por exemplo, para contar quantos pedidos cada cliente fez:
SELECT cliente_id, COUNT(*) AS total_pedidos
FROM pedidos
GROUP BY cliente_id;
Isso agrupa as linhas por cliente e mostra a quantidade de pedidos de cada um. Em geral, quando
usamos GROUP BY , todas as colunas não-agrupadas devem estar em agregações 14 . Exemplo real
com nossa base de amostra:
SELECT COUNT(nome), entrada
FROM refeicoes
GROUP BY entrada;
Isso contou quantas pessoas preferem cada entrada 14 . Para filtrar grupos use HAVING (funciona
como WHERE mas após GROUP BY ). Exemplo: mostrar só entradas escolhidas por pelo menos 3
pessoas:
SELECT COUNT(nome), entrada
FROM refeicoes
GROUP BY entrada
HAVING COUNT(nome) >= 3;
Isso retornaria apenas os grupos com 3 ou mais ocorrências 15 .
Também podemos fazer cálculos diretos em colunas no SELECT, sem função agregada. Por exemplo,
se tivéssemos preço e quantidade:
SELECT nome_produto, preco * quantidade AS total
FROM vendas;
Isso multiplica as colunas para cada linha.
Consultas em várias tabelas (JOIN)
Bancos relacionais têm várias tabelas. Para combinar dados de duas (ou mais) tabelas relacionando-as
por uma chave, usamos JOIN. A sintaxe básica em MySQL é:
SELECT t1.colunaA, t2.colunaB
FROM tabela1 AS t1
4
JOIN tabela2 AS t2
ON t1.coluna_rel = t2.coluna_rel;
A cláusula JOIN combina linhas de tabela1 e tabela2 quando a condição ON é satisfeita
(valores iguais na coluna relacionada) 16 17 . Por exemplo, dado duas tabelas torneios(nome,
tamanho) e refeicoes(nome, data_nascimento) , podemos juntar pelos nomes:
SELECT t.nome, t.tamanho, r.data_nascimento
FROM torneios AS t
JOIN refeicoes AS r
ON t.nome = r.nome;
Isso retornará linhas somente onde o nome aparece em ambas as tabelas (INNER JOIN) 18 . No
exemplo acima, sairiam Dolly, Etta, Irma, Barbara e Gladys com seus tamanhos e datas de nascimento.
Podemos usar outros tipos de JOIN:
- LEFT JOIN: traz todas as linhas da tabela da esquerda (antes do FROM ) e as correspondências da
direita. Se não houver correspondência, os campos da direita ficam NULL . No exemplo:
SELECT t.nome, t.tamanho, r.data_nascimento
FROM torneios AS t
LEFT JOIN refeicoes AS r
ON t.nome = r.nome;
Aqui aparece Bettye (que só estava em torneios ) com data_nascimento = NULL 19 20 .
- RIGHT JOIN: análogo, mas traz todas da tabela da direita (depois do JOIN ).
- FULL JOIN (não nativo em MySQL, pode simular com UNION ).
Também há o CROSS JOIN (produto cartesiano) e UNION de múltiplos SELECTs, mas o mais comum
para relacionar dados é o INNER/LEFT/RIGHT JOIN acima. Em consultas complexas podemos usar alias
para tabelas (como fizemos com t e r acima) para facilitar a leitura.
Variáveis no MySQL
No MySQL podemos usar variáveis de usuário (de sessão) para guardar valores temporários entre
comandos. Elas começam com @ . Por exemplo:
SET @minhaVar = 10;
SELECT @minhaVar;
Isto armazena 10 em @minhaVar e depois exibe o valor 21 . Também podemos atribuir valores
vindos de um SELECT a variáveis:
SELECT @maxId := MAX(id) FROM tabela;
ou diretamente:
5
SELECT @id := id, @nome := nome
FROM pessoas
WHERE id = 5;
Isso define @id e @nome com os valores retornados (note que, se o SELECT retorna várias linhas, a
variável ficará com o valor da última linha) 22 . Em geral, variáveis de usuário são úteis para passar
valores de uma consulta para outra sem precisar de tabela temporária 23 . Elas existem apenas na
sessão atual e são liberadas quando a conexão termina 24 .
As variáveis também podem ser usadas em procedimentos armazenados ( DECLARE nomeTipo no
contexto de uma stored procedure), mas isso é mais avançado. Para fins de consultas simples, o
método acima com @nomeVariavel e SET ou := cobre a maioria dos casos 25 21 .
Exemplos Práticos
• Seleção simples:
SELECT id, nome, email
FROM pessoas
WHERE cidade = 'Rio de Janeiro';
Traz as colunas id , nome , email de todas as pessoas que moram no Rio (outras linhas são
ignoradas pelo WHERE ).
• Cálculo e alias:
SELECT nome, salario, salario * 1.10 AS novo_salario
FROM funcionarios
WHERE salario > 3000;
Lista o nome, o salário atual e o salário aumentado em 10% (apelidado de novo_salario )
para quem ganha mais de 3000.
• Join entre tabelas:
SELECT c.cliente, p.produto, p.preco
FROM pedidos AS c
JOIN produtos AS p ON c.produto_id = p.id;
Retorna nome do cliente, nome do produto e preço, combinando a tabela de pedidos com a
de produtos via o campo relacionado 16 .
• Agregação por grupo:
6
SELECT categoria, SUM(valor) AS total_vendas
FROM vendas
GROUP BY categoria
HAVING SUM(valor) > 1000;
Soma o valor das vendas por categoria , mostrando apenas categorias com venda total
acima de 1000.
• Uso de variáveis:
SET @quant = 0;
SELECT @quant := COUNT(*)
FROM usuarios
WHERE ativo = 1;
SELECT @quant AS total_ativos;
Conta quantos usuários ativos existem e armazena em @quant , depois exibe esse número.
Resumo
• SELECT é usado para consultar dados; combinações com WHERE , ORDER BY , GROUP BY e
funções permitem filtrar e resumir os resultados 8 14 .
• JOINs combinam tabelas relacionadas, permitindo buscar colunas de duas ou mais tabelas em
uma única consulta 16 .
• Variáveis ( @var ) guardam valores entre comandos na mesma sessão, úteis para cálculos
intermediários 23 21 .
• DML completo inclui INSERT , UPDATE , DELETE para manipular dados (sempre use WHERE
em UPDATE / DELETE para não afetar tudo) 7 4 .
• DDL ( CREATE , ALTER , DROP ) define a estrutura de bancos e tabelas antes de inserir/
consultar dados 26 5 .
Com esses comandos e conceitos você poderá “conversar” com o banco de dados MySQL: escrever
queries para selecionar informações, combinar tabelas, atualizar registros e gerenciar a estrutura do
banco. Praticar com exemplos reais (como os acima) ajuda a fixar o funcionamento completo de cada
comando.
Fontes: Material de tutoriais e documentações oficiais do MySQL e guias SQL 1 9 14 16 23 21
(estes recursos explicam em detalhes cada comando e cláusula mencionados).
1 2 5 8 9 10 11 12 13 14 15 16 17 18 19 20 26 Uma Introdução às consultas no MySQL |
DigitalOcean
https://www.digitalocean.com/community/tutorials/uma-introducao-as-consultas-no-mysql-pt
3 4 6 7 Comandos básicos do MySQL (Insert, Delete, Update e Select)
https://www.rlsystem.com.br/select-insert-delete-update-mysql
21 22 sql - MySQL usando variáveis no select - Stack Overflow em Português
https://pt.stackoverflow.com/questions/253674/mysql-usando-vari%C3%A1veis-no-select
7
23 Utilizando Variáveis definidas pelo usuário no MySQL
https://doh.ms/2006/09/27/criando-chaves-primarias-em-tabelas-com-dados/
24 25 MySQL :: MySQL 8.4 Reference Manual :: 11.4 User-Defined Variables
https://dev.mysql.com/doc/refman/8.4/en/user-variables.html