Sequência de Aprendizado Sobre SQL Com MySQL - 250404 - 145132
Sequência de Aprendizado Sobre SQL Com MySQL - 250404 - 145132
Aprendendo SQL
Pablo Oliveira
IFSC - Canoinhas
4/4/2025
Sumário
1. Introdução ao MySQL e SQL ................................................................... 2
2. Conectando e Interagindo com o MySQL ................................................... 3
3. DDL (Data Definition Language) - Definindo a Estrutura do Banco de Dados......... 4
3.1. CREATE DATABASE - Criando um Banco de Dados ................................... 4
3.2. CREATE TABLE - Criando Tabelas....................................................... 5
3.3. ALTER TABLE - Modificando a Estrutura de Tabelas................................. 7
3.4. DROP DATABASE - Excluindo um Banco de Dados.................................... 8
3.5. DROP TABLE - Excluindo Tabelas ....................................................... 9
3.6. RENAME TABLE - Renomeando Tabelas ............................................... 10
3.7. TRUNCATE TABLE - Limpando Tabelas ............................................... 11
4. CRUD (Create, Read, Update, Delete) - Manipulando Dados .......................... 12
4.1. Create (Inserir Dados) - INSERT INTO ................................................. 12
4.2. Read (Ler/Consultar Dados) - SELECT ................................................ 15
4.3. Update (Atualizar Dados) - UPDATE................................................... 18
4.4. Delete (Excluir Dados) - DELETE FROM ............................................... 20
5. Views ............................................................................................ 21
6. Joins ............................................................................................. 24
7. Funções (Functions) .......................................................................... 27
8. Procedures (Stored Procedures) ............................................................ 29
9. Triggers ......................................................................................... 32
10. Comandos SQL que Retornam o Número de Linhas Afetadas ......................... 34
11. Outros Conceitos Importantes ............................................................. 37
Índices ........................................................................................... 37
Constraints (Restrições): ..................................................................... 38
Transações: ..................................................................................... 39
Normalização Básica: ......................................................................... 40
Tabela de Referência Rápida dos Principais Comandos SQL .............................. 41
Referências ........................................................................................ 43
1
1. Introdução ao MySQL e SQL
O SQL é a linguagem padrão mais comum utilizada para acessar e manipular bancos
de dados, sendo definida pelo padrão ANSI/ISO SQL. Este padrão tem evoluído desde
1986, com diversas versões, como SQL-92 (1992), SQL-99 (1999) e SQL:2003 (em
desenvolvimento em meados de 2003). Ao longo deste aprendizado, referir-nos-emos
geralmente a "o padrão SQL" como a versão atual. O MySQL oferece diversos recursos
e funcionalidades que o tornam uma ferramenta poderosa para gerenciar dados. É
gratuito para uso comercial e privado, seguindo a licença pública GPL.
Exemplos Comentados: Não há exemplos de código SQL nesta seção introdutória, mas
é fundamental entender que todos os comandos SQL interagem com os dados
armazenados nas tabelas do seu banco de dados.
2
2. Conectando e Interagindo com o MySQL
Uma vez conectado, o prompt mysql> indica que o sistema está pronto para receber
comandos. Você pode obter ajuda sobre os comandos disponíveis usando o comando
help. Para encerrar a conexão, utilize o comando QUIT ou exit.
• Exemplos Comentados:
• mysql> help
• mysql> quit
• Bye
3
4. Desconecte-se do servidor.
Exemplos Comentados:
• USE meu_banco_de_dados;
4
1. Crie um banco de dados chamado escola.
3. Tente criar novamente o banco de dados escola sem usar IF NOT EXISTS e
observe o erro.
Erros Comuns e Boas Práticas: Um erro comum é tentar criar um banco de dados
com um nome inválido (por exemplo, contendo espaços sem aspas). Uma boa prática
é escolher nomes descritivos e seguir as convenções de nomenclatura do seu
ambiente. Lembre-se da sensibilidade a maiúsculas e minúsculas em alguns sistemas.
Explicações Detalhadas: O comando CREATE TABLE é usado para criar novas tabelas
dentro do banco de dados selecionado. Você precisa definir o nome da tabela e as
colunas que ela conterá, especificando o nome de cada coluna e seu tipo de dados.
Você também pode definir restrições (constraints) como chaves primárias (PRIMARY
KEY) e chaves únicas (UNIQUE).
O comando SHOW CREATE TABLE nome_tabela exibe a instrução CREATE TABLE usada
para criar uma tabela. Você também pode criar uma tabela baseada no resultado de
uma consulta SELECT usando CREATE TABLE nova_tabela SELECT colunas FROM
tabela_existente;. Índices não são criados automaticamente nesse processo.
Exemplos Comentados:
5
o CREATE TABLE IF NOT EXISTS clientes: Cria uma tabela chamada clientes
se ela não existir.
o nome VARCHAR(255) NOT NULL: Cria uma coluna nome para armazenar
strings de até 255 caracteres, e o valor não pode ser nulo.
o email VARCHAR(255) UNIQUE: Cria uma coluna email para strings de até
255 caracteres, e todos os valores devem ser únicos.
• CREATE TABLE clientes_ativos SELECT id, nome, email FROM clientes WHERE ...;
o Cria uma nova tabela clientes_ativos com base nos resultados de uma
consulta SELECT na tabela clientes.
1. Crie uma tabela chamada produtos com colunas para id (inteiro, chave primária,
auto incremento), nome (varchar(100), não nulo), preco (decimal(10, 2)), e
estoque (inteiro).
3. Crie uma segunda tabela chamada pedidos com colunas para id (inteiro, chave
primária, auto incremento), cliente_id (inteiro, chave estrangeira referenciando o
id da tabela clientes), e data_pedido (datetime). (Observe que a funcionalidade
completa de chave estrangeira pode depender do tipo da tabela).
6
4. Tente criar uma tabela com uma coluna do tipo TEXT para armazenar grandes
quantidades de texto.
Erros Comuns e Boas Práticas: Erros comuns incluem especificar tipos de dados
inadequados para os dados que serão armazenados, esquecer de definir chaves
primárias, e não considerar as relações entre as tabelas ao definir chaves
estrangeiras.
Boas práticas incluem planejar cuidadosamente a estrutura das tabelas, usar nomes
de colunas descritivos, e escolher os tipos de dados mais eficientes para cada
coluna.
A sintaxe detalhada para cada operação pode variar. Para modificar especificações de
colunas, consulte a documentação específica. É possível realizar múltiplas alterações
em uma única instrução ALTER TABLE.
• Exemplos Comentados:
• ALTER TABLE pedidos ADD CONSTRAINT fk_cliente FOREIGN KEY (cliente_id) REFERENCES clientes(id);
7
o Adiciona uma restrição de chave estrangeira chamada fk_cliente à
tabela pedidos, referenciando a coluna id da tabela clientes (suportado
em InnoDB).
• ALTER TABLE clientes CHANGE COLUMN nome nome_completo VARCHAR(150) NOT NULL;
Erros Comuns e Boas Práticas: Erros comuns incluem tentar alterar o tipo de dados
de uma coluna para um tipo incompatível com os dados existentes, tentar remover
uma coluna que é referenciada por uma chave estrangeira (sem remover a chave
estrangeira primeiro), e erros de sintaxe no comando ALTER TABLE.
Uma boa prática é fazer um backup do banco de dados antes de realizar alterações
estruturais, planejar as alterações cuidadosamente, e testar as alterações em um
ambiente de desenvolvimento antes de aplicá-las em produção.
Exemplos Comentados:
8
• DROP DATABASE meu_banco_de_dados;
Erros Comuns e Boas Práticas: O erro mais grave é excluir um banco de dados em
produção por engano, resultando em perda de dados crítica. A boa prática
fundamental é ter certeza absoluta de que você deseja excluir o banco de dados
correto e ter backups recentes em caso de erro.
Explicações Detalhadas: O comando DROP TABLE é usado para remover uma ou mais
tabelas existentes do banco de dados. A sintaxe básica é DROP TABLE
nome_da_tabela;.
Assim como DROP DATABASE, esta operação é irreversível e todos os dados da tabela
serão perdidos. Você pode excluir múltiplas tabelas com uma única instrução DROP
TABLE, separando os nomes por vírgula. A opção IF EXISTS pode ser usada para evitar
erros se a tabela não existir.
Exemplos Comentados:
9
• DROP TABLE produtos, pedidos;
Sugestões de Aplicabilidade Prática: DROP TABLE é usado para remover tabelas que
não são mais necessárias ou que foram criadas para fins temporários.
6. Crie duas tabelas de teste (table_a e table_b) e exclua ambas com um único
comando DROP TABLE.
Erros Comuns e Boas Práticas: Um erro comum é excluir uma tabela que ainda é
necessária ou que possui relações com outras tabelas (chaves estrangeiras). A boa
prática é compreender as dependências entre as tabelas antes de excluí-las e ter
backups em caso de erro.
Você pode renomear múltiplas tabelas em uma única instrução, separando cada par de
nomes antigo/novo por vírgula.
Exemplos Comentados:
10
o Renomeia a tabela produtos para itens e a tabela pedidos para compras.
Sugestões de Aplicabilidade Prática: Renomear tabelas pode ser útil para melhorar a
clareza e a consistência do esquema do banco de dados.
Erros Comuns e Boas Práticas: Um erro comum é tentar renomear uma tabela para
um nome que já existe. A boa prática é verificar se o novo nome está disponível
antes de realizar a renomeação.
Portanto, TRUNCATE TABLE é mais rápido para limpar grandes tabelas. No MySQL 4.0
e posterior, TRUNCATE é a forma recomendada para esvaziar tabelas grandes em vez
de DELETE FROM.
• Exemplos Comentados:
11
Propostas de Exercícios Guiados:
1. Crie uma tabela com uma coluna AUTO_INCREMENT e insira alguns dados.
Erros Comuns e Boas Práticas: Um erro comum é usar TRUNCATE TABLE em uma
tabela que possui relações de chave estrangeira com outras tabelas, pois pode haver
restrições que impedem a operação.
A boa prática é ter cuidado ao usar TRUNCATE TABLE, pois a operação não pode ser
desfeita por meio de ROLLBACK em muitos SGBDs (verifique a documentação do MySQL
sobre comportamento transacional de DDL).
Explicações Detalhadas: O comando INSERT INTO é usado para adicionar novas linhas
(registros) a uma tabela. Existem várias formas de usar INSERT INTO:
Inserindo valores para todas as colunas: Se você fornecer valores para todas as
colunas da tabela na ordem em que foram definidas, pode omitir a lista de colunas. A
sintaxe é INSERT INTO nome_tabela VALUES (valor1, valor2, ...);.
Inserindo valores para colunas específicas: Você pode especificar as colunas para
as quais deseja fornecer valores. As colunas não especificadas receberão seus
valores padrão (se definidos) ou NULL. A sintaxe é INSERT INTO nome_tabela
(coluna1, coluna2, ...) VALUES (valor1, valor2, ...);.
12
usando múltiplas listas de valores separadas por vírgula: INSERT INTO nome_tabela
(coluna1, coluna2) VALUES (valor1_1, valor1_2), (valor2_1, valor2_2), ...;.
Inserindo dados a partir de uma consulta SELECT: Você pode inserir dados em
uma tabela selecionando-os de outra tabela ou de uma consulta. A sintaxe é INSERT
INTO tabela_destino (coluna1, coluna2, ...) SELECT coluna_origem1,
coluna_origem2, ... FROM tabela_origem WHERE ...;. Se a lista de colunas for
omitida, os valores do SELECT devem corresponder à ordem das colunas na tabela
de destino.
o A sintaxe INSERT INTO ... SET col_name = valor, ... também é suportada.
o As cláusulas DELAYED e LOW_PRIORITY podem ser usadas em instruções
INSERT para influenciar a prioridade da inserção.
o REPLACE pode ser usado no lugar de DELETE + INSERT para evitar
duplicidades em chaves únicas.
o INSERT IGNORE permite ignorar erros de chave duplicada.
o Para descobrir a ordem das colunas, use DESCRIBE nome_tabela.
o A função LAST_INSERT_ID() retorna o último valor inserido em uma
coluna AUTO_INCREMENT.
Exemplos Comentados:
13
o INSERT INTO produtos (nome, preco): Especifica a tabela e as colunas
que receberão valores.
INSERT INTO pedidos (cliente_id, data_pedido) VALUES (1, NOW()), (2, NOW()), (1, DATE_SUB(NOW(), INTERVAL 1 DAY));
o Insere três novos registros na tabela pedidos com diferentes valores para
cliente_id e data_pedido (usando funções de data e hora).
INSERT INTO clientes (nome, email) SELECT nome_completo, email_contato FROM potenciais_clientes WHERE ativo = 1;
3. Crie uma tabela temporária temp_clientes com algumas colunas em comum com
clientes e insira alguns dados nela. Depois, use INSERT INTO ... SELECT para copiar
dados de temp_clientes para clientes.
Erros Comuns e Boas Práticas: Erros comuns incluem fornecer um número incorreto
de valores para as colunas, tentar inserir valores de tipos incompatíveis, e violar
restrições como NOT NULL ou UNIQUE.
Boas práticas incluem sempre especificar as colunas no INSERT INTO para maior
clareza e evitar problemas com alterações na estrutura da tabela, validar os dados
14
da aplicação antes de inserir no banco de dados, e usar inserções em lote (INSERT
com múltiplos VALUES) para melhor performance ao inserir muitos registros.
15
exemplo, LIMIT 10 ou LIMIT 5, 10). Variáveis SQL podem ser usadas em
LIMIT (como em LIMIT @a,@b).
o A cláusula DISTINCT pode ser usada para retornar apenas valores únicos.
o JOIN é usado para combinar linhas de duas ou mais tabelas com base em
uma condição relacionada. Os diferentes tipos de JOIN serão detalhados
posteriormente.
o O comando SHOW pode ser usado para obter informações sobre bancos
de dados, tabelas e índices. Por exemplo, SHOW COLUMNS FROM
nome_tabela ou DESCRIBE nome_tabela mostram a estrutura de uma
tabela. SHOW INDEX FROM nome_tabela exibe informações sobre os
índices. mysqlshow nome_db nome_tabela também pode ser usado para
exibir informações sobre tabelas e colunas.
Exemplos Comentados:
16
-- Selecionando produtos com preço entre 100 e 500, ordenados por preço em
ordem decrescente
SELECT nome, preco FROM produtos WHERE preco BETWEEN 100 AND 500 ORDER BY preco DESC;
o WHERE preco BETWEEN 100 AND 500: Filtra produtos com preço dentro
do intervalo especificado.
2. Selecione apenas os nomes dos produtos com estoque maior que 10.
6. Use EXPLAIN SELECT * FROM clientes WHERE nome LIKE 'J%'; para ver o plano de
execução da consulta.
17
Erros Comuns e Boas Práticas: Erros comuns incluem erros de sintaxe, esquecer a
cláusula WHERE em consultas que deveriam ser filtradas, usar aliases que conflitam
com nomes de colunas existentes, e não otimizar consultas para grandes volumes
de dados (usando EXPLAIN e índices).
Boas práticas incluem ser específico sobre as colunas que você precisa, usar a
cláusula WHERE para limitar os resultados sempre que possível, ordenar os
resultados apenas quando necessário, e criar índices nas colunas frequentemente
usadas em cláusulas WHERE e ORDER BY para melhorar a performance.
Exemplos Comentados:
18
o SET email = '[email protected]': Define o novo valor para a coluna
email.
4. Tente atualizar o email de um cliente para um valor que já existe em outra linha
(se a coluna email tiver a restrição UNIQUE). Observe o erro.
Erros Comuns e Boas Práticas: O erro mais perigoso é esquecer a cláusula WHERE, o
que pode levar a atualizações indesejadas em toda a tabela. Outros erros incluem
tentar definir valores de tipos incompatíveis ou violar restrições.
Boas práticas incluem sempre usar a cláusula WHERE para especificar precisamente
quais linhas devem ser atualizadas, fazer um SELECT com a mesma cláusula WHERE
19
antes do UPDATE para verificar as linhas que serão afetadas, e ter backups em caso
de erro.
Exemplos Comentados:
20
o Exclui todas as linhas da tabela produtos onde a coluna estoque é igual
a 0.
2. Exclua todos os clientes que não possuem um email registrado (onde a coluna email
é NULL).
Erros Comuns e Boas Práticas: O erro mais crítico é esquecer a cláusula WHERE, o
que resultará na exclusão de todos os dados da tabela. Outros erros incluem tentar
excluir linhas que são referenciadas por outras tabelas (violando restrições de chave
estrangeira, a menos que ON DELETE CASCADE esteja configurado).
Boas práticas incluem sempre usar a cláusula WHERE para especificar precisamente
quais linhas devem ser excluídas, fazer um SELECT com a mesma cláusula WHERE
antes do DELETE para verificar as linhas que serão afetadas, e ter backups em caso
de erro. Para esvaziar grandes tabelas, prefira TRUNCATE TABLE se a estrutura precisar
ser mantida e o AUTO_INCREMENT resetado.
5. Views
Explicações Detalhadas: Uma view (ou visão) é uma tabela virtual baseada no
resultado de uma consulta SELECT. As views não armazenam dados fisicamente; em
21
vez disso, elas armazenam a definição da consulta. Quando você consulta uma view,
o MySQL executa a consulta subjacente e retorna o resultado.
-- Criando uma view que exibe apenas o nome e o email de clientes ativos
(assumindo que há uma coluna 'ativo')
22
-- (Exemplo de atualização, pode ter limitações)
1. Crie uma view que mostre apenas os produtos com preço superior a um
determinado valor.
2. Crie uma view que combine os nomes dos clientes com o número de pedidos que
cada um fez (isso envolverá GROUP BY e COUNT()).
4. (Se sua versão do MySQL suportar atualização de views) Tente atualizar dados
através de uma view e observe se as alterações se refletem nas tabelas base.
Erros Comuns e Boas Práticas: Erros comuns incluem criar views baseadas em
consultas muito complexas que podem prejudicar o desempenho, e tentar atualizar
views que não são atualizáveis devido à complexidade da consulta subjacente (por
exemplo, views envolvendo agregações ou GROUP BY).
Boas práticas incluem usar views para simplificar a lógica de consulta, documentar
o propósito das views, e testar o desempenho das consultas que utilizam views.
23
6. Joins
Explicações Detalhadas: Joins são usados para combinar linhas de duas ou mais
tabelas com base em uma coluna relacionada entre elas. A cláusula JOIN é usada na
parte FROM de uma instrução SELECT.
o INNER JOIN (ou apenas JOIN): Retorna apenas as linhas quando há uma
correspondência em ambas as tabelas com base na condição de JOIN.
o LEFT OUTER JOIN (ou LEFT JOIN): Retorna todas as linhas da tabela
da esquerda e as linhas correspondentes da tabela da direita. Se não
houver correspondência na tabela da direita, as colunas da direita terão
valores NULL.
o RIGHT OUTER JOIN (ou RIGHT JOIN): Retorna todas as linhas da tabela
da direita e as linhas correspondentes da tabela da esquerda. Se não
houver correspondência na tabela da esquerda, as colunas da esquerda
terão valores NULL.
o FULL OUTER JOIN (ou FULL JOIN): Retorna todas as linhas de ambas
as tabelas. Se não houver correspondência entre as tabelas, as colunas
da tabela sem correspondência terão valores NULL. O suporte para FULL
OUTER JOIN pode variar entre SGBDs (o MySQL pode não ter suporte
direto em algumas versões, sendo necessário usar UNION com LEFT JOIN
e RIGHT JOIN para emular esse comportamento).
o Você pode usar aliases para tabelas para tornar as consultas com JOIN
mais concisas.
24
o INNER JOIN: Imagine dois círculos sobrepostos. Um representa a tabela
A e o outro a tabela B. O INNER JOIN retorna a área onde os círculos se
sobrepõem (as linhas que existem em ambas as tabelas com base na
condição).
Exemplos Comentados: (Assumindo que temos as tabelas clientes e pedidos com uma
coluna comum cliente_id)
-- INNER JOIN: Seleciona os nomes dos clientes e os IDs dos seus pedidos
25
Retorna todos os pedidos da tabela pedidos. Se um pedido tiver um cliente_id que não corresponde a nenhum
id na tabela clientes, a coluna nome terá o valor NULL para esse pedido.
-- (Exemplo de CROSS JOIN - geralmente usado com WHERE)
SELECT c.nome, pr.nome AS nome_produto
FROM clientes c
CROSS JOIN produtos pr
WHERE c.id = 1; -- Adicionando uma condição para limitar o resultado (sem condição, seria o produto cartesiano
completo)
o Combina cada cliente com cada produto, e então filtra para mostrar
apenas as combinações para o cliente com id = 1.
1. Usando as tabelas clientes e pedidos, escreva uma consulta que retorne o nome de
cada cliente e o número total de pedidos que ele fez (isso envolverá JOIN e GROUP
BY).
2. Escreva uma consulta que liste todos os clientes e seus respectivos endereços
(assumindo que você tem uma tabela enderecos ligada a clientes). Use um LEFT
JOIN para garantir que todos os clientes sejam listados, mesmo que não tenham
um endereço registrado.
3. Crie uma terceira tabela chamada categorias e relacione-a com a tabela produtos.
Escreva uma consulta que retorne o nome do produto e o nome da sua categoria
usando um INNER JOIN.
Erros Comuns e Boas Práticas: Erros comuns incluem usar o tipo de JOIN incorreto,
esquecer ou definir incorretamente a condição de JOIN (na cláusula ON), o que
pode levar a resultados inesperados (como o produto cartesiano não intencional), e
não usar aliases para tabelas, o que pode tornar as consultas com múltiplos joins
difíceis de ler.
26
7. Funções (Functions)
Não deve haver espaço em branco entre o nome da função e os parênteses que a
seguem. O MySQL também permite a criação de Funções Definidas pelo Usuário
(UDFs), que são funções personalizadas implementadas em linguagens como C ou C++
e carregadas no servidor MySQL.
Para criar uma UDF, você precisa escrever o código na linguagem apropriada, compilá-
lo em uma biblioteca compartilhada e, em seguida, registrar a função no MySQL usando
o comando CREATE FUNCTION. Você precisa definir o nome da função, os tipos de
dados dos parâmetros de entrada e o tipo de dados do valor de retorno. O corpo da
função UDF conterá a lógica implementada no código compilado.
Exemplos Comentados:
27
-- RETURN preco * 0.9;
-- END;
1. Use funções de data e hora para selecionar todos os pedidos feitos no mês
passado.
2. Use funções de string para exibir os nomes dos clientes com a primeira letra em
maiúscula e o restante em minúsculas.
4. (Desafio avançado) Pesquise como criar uma UDF simples em MySQL (se você
tiver um ambiente de desenvolvimento configurado) e tente implementá-la e usá-la
em uma consulta.
Erros Comuns e Boas Práticas: Erros comuns incluem erros de sintaxe ao chamar
funções (esquecer parênteses, vírgulas), usar funções em tipos de dados incorretos,
e não entender o valor de retorno de uma função. Ao criar UDFs, erros podem ocorrer
na implementação do código, na compilação da biblioteca, ou no registro da função
no MySQL.
28
Boas práticas incluem consultar a documentação do MySQL para entender o uso e os
parâmetros de cada função built-in, usar aliases para tornar os resultados com
funções mais legíveis, e ter cuidado ao criar UDFs, garantindo que o código seja
seguro e eficiente. Note que stored FUNCTIONs não podiam conter referências a
tabelas em algumas versões do MySQL (incluindo algumas instruções SET mas excluindo
algumas instruções SELECT), mas essa limitação seria removida.
Para criar uma stored function (que retorna um valor), a sintaxe é CREATE FUNCTION
nome_funcao ([parâmetro1 tipo1, ...]) RETURNS tipo_retorno [características] BEGIN
instruções_sql; RETURN valor; END;. Stored procedures podem conter várias instruções
SQL, incluindo DDL (como CREATE e DROP) e instruções de transação (como COMMIT).
Para executar um stored procedure, use o comando CALL
nome_procedimento(argumentos);.
Exemplos Comentados:
DELIMITER //
CREATE PROCEDURE sp_listar_clientes_por_cidade (IN cidade_param VARCHAR(50))
29
BEGIN
SELECT nome, email FROM clientes WHERE cidade = cidade_param;
END //
DELIMITER ;
30
-- Removendo os objetos criados
o O primeiro exemplo shows uma procedure que recebe uma cidade como
entrada e retorna os clientes dessa cidade.
1. Crie uma stored procedure que receba o ID de um cliente como entrada e retorne
todos os seus pedidos.
31
3. Crie uma stored function que receba uma data como entrada e retorne o dia da
semana por extenso (por exemplo, 'Segunda-feira').
Erros Comuns e Boas Práticas: Erros comuns incluem erros de sintaxe na definição
da stored procedure ou function, não tratar corretamente os parâmetros de
entrada e saída, e criar stored procedures muito complexas que são difíceis de
manter.
Boas práticas incluem usar nomes descritivos para stored procedures e seus
parâmetros, documentar a finalidade e o uso de cada stored procedure, validar os
dados de entrada dentro da stored procedure, e manter as stored procedures
focadas em uma tarefa específica. Stored procedures aumentam a carga no servidor
de banco de dados, pois grande parte do trabalho é feita no servidor e menos no
cliente. É importante considerar esse impacto no desempenho.
9. Triggers
Explicações Detalhadas: Triggers (ou gatilhos) são blocos de código SQL que são
automaticamente executados (ou "disparados") em resposta a certos eventos que
ocorrem em uma tabela específica.
Você pode usar as palavras-chave NEW e OLD dentro do trigger para referenciar os
novos e os antigos valores das linhas que estão sendo modificadas.
Exemplos Comentados:
32
-- Exemplo de trigger AFTER INSERT para auditar novas inserções na tabela clientes
DELIMITER //
CREATE TRIGGER trg_clientes_after_insert
AFTER INSERT ON clientes
FOR EACH ROW
BEGIN
INSERT INTO auditoria_clientes (data_evento, tipo_evento, cliente_id, nome)
VALUES (NOW(), 'INSERT', NEW.id, NEW.nome);
END //
DELIMITER ;
-- Exemplo de trigger BEFORE UPDATE para garantir que o email esteja sempre em minúsculas
DELIMITER //
CREATE TRIGGER trg_clientes_before_update
BEFORE UPDATE ON clientes
FOR EACH ROW
BEGIN
SET NEW.email = LOWER(NEW.email);
END //
DELIMITER ;
o FOR EACH ROW: Especifica que o trigger será executado para cada linha
afetada pelo evento.
33
o NEW.id e NEW.nome: Referenciam os valores da coluna id e nome da
nova linha inserida.
2. Crie um trigger que registre na tabela de auditoria sempre que um produto for
inserido, atualizado ou excluído, incluindo os dados relevantes (como o nome do
produto e o tipo de evento).
3. Crie um trigger que impeça a exclusão de clientes que possuem pedidos pendentes
(isso pode envolver verificar a existência de registros relacionados em outra
tabela).
Erros Comuns e Boas Práticas: Erros comuns incluem criar triggers que causam loops
infinitos (por exemplo, um trigger de atualização que dispara outro trigger de
atualização na mesma tabela), afetar negativamente o desempenho devido à
execução de lógica complexa em cada evento, e tornar a lógica do banco de dados
difícil de entender se houver muitos triggers com funcionalidades complexas.
Boas práticas incluem usar triggers com moderação, manter a lógica dos triggers
simples e focada em uma tarefa específica, documentar claramente o propósito e
o funcionamento de cada trigger, e considerar o impacto no desempenho.
34
Explicações Detalhadas: Após a execução de comandos DML (Data Manipulation
Language) como INSERT, UPDATE, DELETE, e REPLACE, é frequentemente útil saber
quantas linhas foram afetadas pela operação. O MySQL fornece diferentes maneiras
de obter essa informação:
Exemplos Comentados:
35
-- Tentando inserir um cliente com email duplicado (se a coluna 'email' for UNIQUE
e o registro já existir)
1. Execute um comando INSERT e use ROW_COUNT() para verificar se uma linha foi
inserida.
2. Execute um comando UPDATE com uma cláusula WHERE que corresponda a várias
linhas e use ROW_COUNT() para verificar o número de linhas atualizadas.
4. Tente inserir um registro que viole uma restrição UNIQUE e observe o valor
retornado por ROW_COUNT().
36
Boas práticas incluem chamar ROW_COUNT() imediatamente após a instrução DML
cuja contagem você deseja verificar, e interpretar o resultado corretamente com
base no tipo de operação e nas possíveis condições (como IGNORE ou REPLACE).
Índices
Eles funcionam de forma semelhante aos índices de um livro, permitindo que o banco
de dados localize rapidamente as linhas que correspondem a uma determinada
condição, sem precisar examinar cada linha da tabela (table scan, que EXPLAIN pode
mostrar como ALL na coluna type, indicando uma busca completa na tabela).
Os índices são criados em uma ou mais colunas de uma tabela. Os tipos comuns de
índices incluem índices B-tree (usados na maioria dos casos), índices UNIQUE
(garantem que os valores em uma coluna sejam únicos), índices de texto completo
(FULLTEXT) para pesquisas textuais eficientes, e índices espaciais para dados
geográficos.
37
de EXPLAIN indica o índice usado). Remova os índices usando DROP
INDEX.
o Erros e Boas Práticas: Não crie muitos índices em uma única tabela (isso
pode prejudicar o desempenho das operações de escrita). Crie índices
apenas nas colunas que realmente beneficiarão as suas consultas mais
importantes. Execute ANALYZE TABLE nome_tabela periodicamente
para atualizar as estatísticas da tabela, o que ajuda o otimizador do
MySQL a fazer melhores escolhas sobre quais índices usar.
Constraints (Restrições):
Explicações: Constraints são regras usadas para limitar o tipo de dados que podem
ser inseridos em uma tabela, garantindo a precisão e a confiabilidade dos dados
(integridade dos dados). Já vimos alguns exemplos:
▪ NOT NULL: Garante que uma coluna não pode conter valores
NULL.
38
durante a criação da tabela (CREATE TABLE) ou podem ser
adicionadas ou removidas posteriormente usando ALTER TABLE.
Exercícios: Crie tabelas com diferentes tipos de constraints. Tente inserir dados que
violem as constraints e observe os erros. Use ALTER TABLE para adicionar e remover
constraints.
Transações:
Explicações: Uma transação é uma sequência de uma ou mais operações SQL que
são tratadas como uma única unidade lógica de trabalho. As transações seguem o
modelo ACID:
Atomicidade: Todas as operações dentro de uma transação são concluídas com sucesso
(commit) ou todas são desfeitas (rollback). Não há um estado parcial.
Durabilidade: Uma vez que uma transação é confirmada (committed), suas alterações
são permanentes, mesmo em caso de falhas do sistema.
Para iniciar uma transação, use START TRANSACTION ou BEGIN. Para tornar as
alterações permanentes, use COMMIT. Para desfazer as alterações desde o início da
transação ou desde um savepoint, use ROLLBACK. Você pode definir pontos de
salvamento dentro de uma transação usando SAVEPOINT nome_ponto e reverter para
um ponto específico com ROLLBACK TO SAVEPOINT nome_ponto. O modo AUTOCOMMIT
(ligado por padrão) faz com que cada instrução SQL seja tratada como uma transação
individual. Você pode desativar o autocommit com SET AUTOCOMMIT = 0.
39
Aplicabilidade: Use transações para agrupar operações relacionadas que devem ser
tratadas como uma única unidade, como transferências bancárias (débito de uma conta
e crédito em outra). Isso garante que ambas as operações ocorram ou nenhuma delas
ocorra, mantendo a consistência dos dados.
Erros e Boas Práticas: Não deixe transações abertas por muito tempo, pois isso pode
causar problemas de bloqueio e desempenho. Use transações para garantir a
integridade dos dados em operações complexas. Esteja ciente dos diferentes níveis de
isolamento de transação e escolha o apropriado para a sua aplicação.
Normalização Básica:
Existem várias "formas normais" (1NF, 2NF, 3NF, etc.), cada uma com um conjunto
específico de regras. A normalização básica geralmente envolve dividir tabelas grandes
em tabelas menores e relacionadas, definindo relacionamentos entre elas através de
chaves primárias e estrangeiras.
Exercícios: Considere um cenário com dados redundantes (por exemplo, uma tabela
de pedidos que inclui informações completas do cliente em cada pedido). Tente dividir
esses dados em tabelas separadas (clientes e pedidos) e definir um relacionamento
entre elas usando chaves primárias e estrangeiras.
Erros e Boas Práticas: Não exagere na normalização, pois muitas tabelas com muitos
joins podem impactar o desempenho das consultas. Encontre um equilíbrio entre a
normalização para a integridade dos dados e a desnormalização (em casos específicos
e justificados) para melhorar o desempenho de leitura.
40
Tabela de Referência Rápida dos Principais
Comandos SQL
Categoria Comando Descrição
DML INSERT INTO nome (...) VALUES Adiciona novos registros a uma
(...); tabela.
Outros CREATE VIEW nome AS SELECT ...; Cria uma tabela virtual (view).
41
Outros DROP INDEX nome ON tabela; Remove um índice.
Espero que esta sequência de aprendizado detalhada e progressiva seja útil para a sua
jornada no aprendizado de SQL com MySQL!
42
Referências
MySQL AB (2023). MySQL Reference Manual. On-line
MySQL AB (). Manual de Referência do MySQL 4.1. On-line
Apostilando (2001). Tutorial MySQL. On-line
43