Introdução ao MySQL: Comandos e Operações Essenciais

Conceitos Fundamentais de Banco de Dados

Um banco de dados (BD) é uma coleção organizada de dados armazenados eletronicametne. Os dados são estruturados de forma a minimizar a redundância e maximizar a independência dos dados, permitindo acesso compartilhado por múltiplos usuários e aplicações.

Um Sistema de Gerenciamento de Banco de Dados (SGBD) é o software que interage diretamente com os usuários, aplicações e o próprio banco de dados para capturar e analisar dados. Ele fornece ferramentas para definir a estrutura (esquema) do banco de dados, inserir, manipular e recuperar dados, além de gerenciar o acesso e a segurança. Exemplos populares de SGBDs incluem Oracle, SQL Server, PostgreSQL e MySQL.

Iniciando com o MySQL

Instalação e Inicialização do Serviço

Em sistemas baseados em Linux, o MySQL ou seu fork MariaDB pode ser instalado via gerenciador de pacotes.

# Para instalar no CentOS/RHEL:
sudo yum install mysql-server
# Ou para o MariaDB:
sudo yum install mariadb-server

# Iniciar o serviço e habilitar na inicialização:
sudo systemctl start mysqld
sudo systemctl enable mysqld

Para verificar se o serviço está rodando e escutando na porta padrão (3306):

# Verificar processo
sudo systemctl status mysqld
# Verificar porta em uso
ss -tlnp | grep 3306

Segurança Inicial e Conexão

Após a instalação, é crucial executar o script de segurança para definir a senha root e remover configurações inseguras.

# Executar o script de segurança interativo
sudo mysql_secure_installation

Para se conectar ao servidor MySQL localmente:

# Conexão como usuário root (será solicitada a senha)
mysql -u root -p

# Conexão especificando host e porta
mysql -u root -p -h 127.0.0.1 -P 3306

Recuperação de Senha Esquecida

Se a senha do root for perdida, uma opção é reiniciar o servidor em modo seguro, ignorando as tabelas de privilégios.

# 1. Parar o serviço MySQL
sudo systemctl stop mysqld
# 2. Iniciar o servidor sem verificação de privilégios
sudo mysqld_safe --skip-grant-tables &
# 3. Conectar-se sem senha e atualizar a senha do root
mysql -u root
UPDATE mysql.user SET authentication_string=PASSWORD('NovaSenha123!') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
# 4. Reiniciar o serviço normalmente
sudo systemctl restart mysqld

Linguagem SQL: Estrutura e Normas

SQL (Structured Query Language) é a linguagem padrão para interagir com bancos de dados relacionais. Ela permite definir estruturas de dados (DDL), manipular os dados (DML) e controlar o acesso (DCL).

Convenções de Escrita

  • Comandos SQL são tipicamente escritos em letras maiúsculas para melhor legibilidade, embora não sejam sensíveis a maiúsculas.
  • Cada instrução SQL é finalizada com um ponto e vírgula (;).
  • Espaços e indentação são usados para organizar cláusulas complexas.
  • Comentários de linha única usam --, e blocos de comentário usam /* ... */.

Operações de Definição de Dados (DDL)

Comandos DDL são usados para criar, modificar e remover a estrutura dos objetos do banco de dados, como bancos e tabelas.

-- Criar um novo banco de dados
CREATE DATABASE IF NOT EXISTS meu_projeto CHARACTER SET utf8mb4;

-- Selecionar o banco de dados para uso
USE meu_projeto;

-- Criar uma tabela de clientes
CREATE TABLE clientes (
    cliente_id INT PRIMARY KEY AUTO_INCREMENT,
    nome_completo VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE,
    data_cadastro DATE DEFAULT (CURRENT_DATE)
);

-- Visualizar a estrutura da tabela
DESCRIBE clientes;

-- Adicionar uma nova coluna à tabela
ALTER TABLE clientes ADD COLUMN telefone VARCHAR(20) AFTER email;

-- Renomear uma tabela
RENAME TABLE clientes TO cadastro_clientes;

-- Excluir uma tabela
DROP TABLE IF EXISTS cadastro_clientes;

Tipos de Dados no MySQL

O MySQL oferece uma variedade de tipos de dados, categorizados principalmente em:

  • Numéricos: Como INT, TINYINT, DECIMAL, FLOAT.
  • Data e Hora: Como DATE, TIME, DATETIME, TIMESTAMP.
  • Strings: Como CHAR (tamanho fixo), VARCHAR (tamanho variável), TEXT para strings longas, e BLOB para dados binários grandes.

Manipulação de Dados (DML)

Os comandos DML (Data Manipualtion Language) permitem inserir, atualizar, deletar e consultar dados.

Inserção de Dados (INSERT)

-- Inserir um único registro
INSERT INTO cadastro_clientes (nome_completo, email, telefone)
VALUES ('Ana Silva', 'ana.silva@email.com', '+5511999887766');

-- Inserir múltiplos registros
INSERT INTO cadastro_clientes (nome_completo, email) VALUES
('Carlos Souza', 'carlos.s@email.com'),
('Maria Oliveira', 'maria.o@email.com');

Atualização de Dados (UPDATE)

-- Atualizar o telefone de um cliente específico
UPDATE cadastro_clientes
SET telefone = '+5521999990000'
WHERE cliente_id = 1;

-- Aumentar todos os salários em 10% (supondo uma tabela com essa coluna)
UPDATE folha_pagamento SET salario = salario * 1.10;

Remoção de Dados (DELETE)

-- Deletar registros que atendam a uma condição
DELETE FROM cadastro_clientes WHERE data_cadastro < '2023-01-01';

-- Deletar TODOS os registros da tabela (cuidado!)
DELETE FROM cadastro_clientes;
-- Para redefinir o AUTO_INCREMENT, use:
ALTER TABLE cadastro_clientes AUTO_INCREMENT = 1;

Consultas de Seleção (SELECT) e Filtragem

A cláusula SELECT é usada para recuperar dados. Sua estrutura completa permite uma enorme flexibilidade.

SELECT [DISTINCT] colunas
FROM tabela
[WHERE condição]
[GROUP BY coluna [HAVING condição_agregada]]
[ORDER BY coluna [ASC|DESC]]
[LIMIT [offset,] linhas];

Exemplos Práticos de Consulta

-- Seleção básica e aliasing
SELECT nome_completo AS Nome, YEAR(data_cadastro) AS AnoCadastro
FROM cadastro_clientes;

-- Filtro com múltiplas condições e operador LIKE
SELECT * FROM cadastro_clientes
WHERE email LIKE '%@email.com' AND data_cadastro BETWEEN '2023-01-01' AND '2023-12-31';

-- Consulta com ordenação e limite
SELECT nome_completo, data_cadastro
FROM cadastro_clientes
ORDER BY data_cadastro DESC
LIMIT 10;

Agregação e Agrupamento

Funções agregadas (COUNT(), SUM(), AVG(), MAX(), MIN()) realizam cálculos sobre conjuntos de valores.

-- Contar o número de clientes por ano de cadastro
SELECT YEAR(data_cadastro) AS Ano, COUNT(*) AS TotalClientes
FROM cadastro_clientes
GROUP BY YEAR(data_cadastro);

-- Filtrar grupos com HAVING
SELECT departamento, AVG(salario) AS SalarioMedio
FROM funcionarios
GROUP BY departamento
HAVING AVG(salario) > 5000;

Integridade Referencial e Chaves Estrangeiras

Para relacionar tabelas e garantir a integridade dos dados, utilizamos chaves estrangeiras.

-- Tabela de departamentos (tabela pai)
CREATE TABLE departamentos (
    dept_id INT PRIMARY KEY AUTO_INCREMENT,
    nome_dept VARCHAR(50) NOT NULL
);

-- Tabela de funcionários (tabela filha)
CREATE TABLE funcionarios (
    func_id INT PRIMARY KEY AUTO_INCREMENT,
    nome VARCHAR(100) NOT NULL,
    dept_id INT,
    CONSTRAINT fk_func_dept
        FOREIGN KEY (dept_id)
        REFERENCES departamentos(dept_id)
        ON DELETE SET NULL -- Se um departamento for removido, o dept_id do funcionário vira NULL
        ON UPDATE CASCADE  -- Se o dept_id mudar na tabela pai, atualiza aqui também
);

Junções (JOINs) para Consultas Multitabelas

Junções permitem combinar linhas de duas ou mais tabelas com base em uma coluna relacionada entre elas.

-- INNER JOIN: Retorna apenas registros com correspondência nas duas tabelas.
SELECT f.nome AS Funcionario, d.nome_dept AS Departamento
FROM funcionarios f
INNER JOIN departamentos d ON f.dept_id = d.dept_id;

-- LEFT JOIN: Retorna todos os registros da tabela da esquerda e os correspondentes da direita.
SELECT f.nome, d.nome_dept
FROM funcionarios f
LEFT JOIN departamentos d ON f.dept_id = d.dept_id;

-- Junção com mais de duas tabelas e filtros
SELECT p.titulo, c.nome AS Cliente, v.valor
FROM pedidos v
JOIN produtos p ON v.produto_id = p.id
JOIN clientes c ON v.cliente_id = c.id
WHERE v.data_pedido > '2023-06-01';

Subconsultas (Subqueries)

Uma subconsulta é uma consulta SELECT aninhada dentro de outra instrução SQL.

-- Encontrar funcionários que trabalham no departamento 'TI'
SELECT nome FROM funcionarios
WHERE dept_id IN (
    SELECT dept_id FROM departamentos WHERE nome_dept = 'TI'
);

-- Usando EXISTS para verificar a existência de dados
SELECT nome FROM funcionarios f
WHERE EXISTS (
    SELECT 1 FROM projetos p WHERE p.responsavel_id = f.func_id
);

Tags: MySQL SQL Administração de Banco de Dados Otimização de Consultas Integridade de Dados

Publicado em 7-7 00:01