Guia Prático de Operações e Consultas Avançadas em MySQL

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;

Tags: MySQL SQL database stored-procedures DDL

Publicado em 7-8 02:41