Gestão de Estrutura de Tabelas (DDL)
A manipulação da estrutura de tabelas é uma tarefa rotineira. Abaixo, apresentam-se os comandos fundamentais para alteração de esquemas.
1. Adicionar nova coluna
ALTER TABLE estoque ADD COLUMN codigo_ean VARCHAR(20) COMMENT 'Código de barras internacional';
2. Renomear coluna existente
ALTER TABLE clientes CHANGE sobrenome ultimo_nome VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL;
3. Alterar tipo de dado de uma coluna
ALTER TABLE transacoes MODIFY valor_total DECIMAL(15,2) NOT NULL COMMENT 'Valor total da venda';
4. Remover uma coluna
ALTER TABLE logs_acesso DROP COLUMN ip_interno;
5. Criação de índices
CREATE INDEX idx_status_pedido ON pedidos (status_processamento);
6. Identificar tabelas sem índices secundários
SELECT table_schema, table_name
FROM information_schema.tables
WHERE (table_schema, table_name) NOT IN (
SELECT DISTINCT table_schema, table_name
FROM information_schema.columns
WHERE COLUMN_KEY = 'MUL'
)
AND table_schema = 'seu_banco_de_dados';
Manipulação Dinâmica de Dados e Consultas
Além do básico, o MySQL permite operações complexas para sincronização e limpeza de dados.
1. Atualização baseada em junção (Join Update)
Sincroniza valores entre duas tabelas distintas que compartilahm uma chave comum.
UPDATE folha_pagamento fp
INNER JOIN funcionarios f ON fp.id_funcionario = f.id_interno
SET fp.conta_destino = f.numero_conta
WHERE fp.situacao = 'PENDENTE';
2. Remover registros duplicados (Mantendo a primeira ocorrência)
DELETE FROM registros_temp
WHERE id_pk NOT IN (
SELECT id_minimo FROM (
SELECT MIN(id_pk) AS id_minimo
FROM registros_temp
GROUP BY hash_verificacao
) AS subconsulta
);
3. Identificar inconsistências de cardinalidade
Exemplo: encontrar uma referência de nota fiscal que posssua múltiplos identificadores de lote vinculados.
SELECT ref_fiscal, COUNT(DISTINCT id_lote) AS total_lotes
FROM processamento_vendas
GROUP BY ref_fiscal
HAVING COUNT(DISTINCT id_lote) > 1;
4. Agrupamento com concatenação de strings
Útil para consolidar múltiplos registros em uma única linha separada por vírgulas.
SELECT categoria_id, COUNT(*), GROUP_CONCAT(nome_produto SEPARATOR '; ') AS lista_produtos
FROM inventario
GROUP BY categoria_id;
5. Extração de valores em strings JSON ou textos formatados
Utilizando funções de string para capturar conteúdos específicos entre delimitadores.
SELECT SUBSTRING_INDEX(
SUBSTRING_INDEX('{"modulo":"financeiro","versao":"2.1"}', '"modulo":"', -1),
'",', 1
) AS nome_modulo;
Busca Global em Todo o Banco de Dados
Para localizar um valor específico em qualquer tabela que contenha colunas do tipo texto, pode-se utilizar um procedimento armazenado (Stored Procedure).
-- Procedimento para executar a busca em colunas específicas
DROP PROCEDURE IF EXISTS sp_buscar_valor_global;
CREATE PROCEDURE sp_buscar_valor_global(IN nome_db VARCHAR(100), IN termo_busca VARCHAR(100))
BEGIN
DECLARE finalizado INT DEFAULT 0;
DECLARE v_tabela VARCHAR(100);
DECLARE v_coluna VARCHAR(100);
DECLARE cursor_campos CURSOR FOR
SELECT TABLE_NAME, COLUMN_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = nome_db
AND DATA_TYPE IN ('varchar', 'text', 'longtext');
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finalizado = 1;
-- Tabelas temporárias para armazenar resultados
CREATE TEMPORARY TABLE IF NOT EXISTS resultados_busca (tab_nome VARCHAR(100), col_nome VARCHAR(100));
TRUNCATE TABLE resultados_busca;
OPEN cursor_campos;
busca_loop: LOOP
FETCH cursor_campos INTO v_tabela, v_coluna;
IF finalizado THEN
LEAVE busca_loop;
END IF;
SET @sql_query = CONCAT('SELECT COUNT(*) INTO @cnt FROM ', v_tabela, ' WHERE ', v_coluna, ' = ?');
PREPARE stmt FROM @sql_query;
SET @val = termo_busca;
EXECUTE stmt USING @val;
DEALLOCATE PREPARE stmt;
IF @cnt > 0 THEN
INSERT INTO resultados_busca VALUES (v_tabela, v_coluna);
END IF;
END LOOP;
CLOSE cursor_campos;
SELECT * FROM resultados_busca;
END;
-- Exemplo de uso:
-- CALL sp_buscar_valor_global('meu_banco', 'termo_procurado');
Consultas de Metadados
Localizar tabelas que possuam colunas específicas ou configurações padrão facilitam auditorias no banco.
-- Listar tabelas que possuem uma coluna específica (ex: 'ativo')
SELECT TABLE_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'producao' AND COLUMN_NAME = 'ativo';
-- Verificar colunas que possuem valores padrão (default) definidos
SELECT TABLE_NAME, COLUMN_NAME, COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'producao'
AND COLUMN_DEFAULT IS NOT NULL;