SQL (Structured Query Language) é a linguagem padrão usada para gerenciar e manipular bancos de dados relacionais. Através do SQL, é possível consultar, inserir, atualizar e excluir dados armazenados em tabelas. Para iniciantes no mundo da programação e banco de dados, aprender SQL é uma habilidade fundamental, já que é amplamente utilizada em diversas aplicações, desde pequenos sistemas até grandes plataformas como redes sociais e e-commerces.
Neste artigo, vamos abordar alguns dos conceitos mais importantes do SQL, como views, temporary tables, materialized views, e partitions. Além disso, você verá exemplos práticos de como utilizar SQL em conjunto com o framework NestJS, uma poderosa ferramenta no ecossistema Node.js. Tudo isso será apresentado de forma clara e adaptada para quem está começando.
O que é SQL?
SQL é uma linguagem declarativa usada para trabalhar com bancos de dados relacionais. Entre suas principais funcionalidades estão:
- CRUD: (Create, Read, Update, Delete) – as operações básicas de gerenciamento de dados.
- Consultas: Recuperação de dados de uma ou mais tabelas através de comandos como
SELECT
,JOIN
,WHERE
eORDER BY
. - Manipulação de estrutura de dados: Criação e alteração de tabelas com
CREATE TABLE
,ALTER TABLE
, etc. - Transações: Controle de alterações no banco de dados, garantindo a integridade e a consistência dos dados.
Principais Conceitos do SQL
1. Views (Visões)
Uma view é uma tabela virtual criada a partir de uma consulta SQL. Ela permite que você simplifique consultas complexas ao encapsulá-las em uma tabela virtual que pode ser tratada como uma tabela comum.
Vantagens:
- Simplificação de consultas complexas.
- Reutilização de lógicas de consulta.
- Segurança, restringindo acesso direto às tabelas originais.
Exemplo:
CREATE VIEW view_usuarios_ativos AS
SELECT nome, email
FROM usuarios
WHERE status = 'ativo';
No NestJS, utilizando o TypeORM, você pode trabalhar com views de forma direta. Basta criar uma entidade representando a view e utilizá-la como qualquer outra tabela:
@Entity({ name: 'view_usuarios_ativos' })
export class ViewUsuariosAtivos {
@Column()
nome: string;
@Column()
email: string;
}
2. Temporary Tables (Tabelas Temporárias)
As temporary tables são tabelas criadas temporariamente durante a execução de uma sessão de banco de dados. Elas são úteis para armazenar resultados intermediários sem poluir o banco de dados principal.
Vantagens:
- Eficiência no processamento de dados temporários.
- Exclusividade da sessão que as cria.
- Deletadas automaticamente ao fim da sessão.
Exemplo:
CREATE TEMPORARY TABLE temp_saldos AS
SELECT cliente_id, SUM(valor) AS saldo
FROM transacoes
GROUP BY cliente_id;
No NestJS, você pode interagir com tabelas temporárias da mesma forma que faria com tabelas regulares, usando QueryBuilder do TypeORM:
await this.dataSource.query(`
CREATE TEMPORARY TABLE temp_saldos AS
SELECT cliente_id, SUM(valor) AS saldo
FROM transacoes
GROUP BY cliente_id;
`);
3. Materialized Views
As materialized views são similares às views, mas diferem por armazenarem fisicamente os dados resultantes da consulta no momento da criação. Isso oferece a vantagem de um acesso mais rápido aos dados, uma vez que não é necessário recomputá-los a cada solicitação.
Vantagens:
- Melhoria no desempenho ao consultar dados precomputados.
- Pode ser atualizada periodicamente ou sob demanda.
Exemplo:
CREATE MATERIALIZED VIEW view_vendas_mensais AS
SELECT vendedor_id, SUM(valor) AS total_vendas
FROM vendas
WHERE data >= '2024-01-01'
GROUP BY vendedor_id;
Para atualizar uma materialized view, você pode usar o comando REFRESH
:
REFRESH MATERIALIZED VIEW view_vendas_mensais;
No NestJS, você pode utilizar QueryBuilder para trabalhar com materialized views, assim como faria com outras tabelas:
await this.dataSource.query('REFRESH MATERIALIZED VIEW view_vendas_mensais');
4. Partitions (Partições)
O conceito de particionamento em bancos de dados refere-se à prática de dividir grandes tabelas em partes menores (partições). Isso é especialmente útil quando você lida com grandes volumes de dados, pois melhora o desempenho das consultas e facilita a manutenção do banco de dados.
Existem diferentes tipos de particionamento:
- Range Partitioning: Divide os dados com base em intervalos de valores.
- List Partitioning: Baseia-se em uma lista de valores predefinidos.
- Hash Partitioning: Usa uma função de hash para distribuir os dados.
Exemplo de particionamento por intervalo de data:
CREATE TABLE pedidos (
id SERIAL,
cliente_id INT,
data_pedido DATE,
valor DECIMAL
) PARTITION BY RANGE (data_pedido);
CREATE TABLE pedidos_2023 PARTITION OF pedidos
FOR VALUES FROM ('2023-01-01') TO ('2023-12-31');
CREATE TABLE pedidos_2024 PARTITION OF pedidos
FOR VALUES FROM ('2024-01-01') TO ('2024-12-31');
No NestJS, você pode configurar entidades que correspondam a tabelas particionadas e utilizar QueryBuilder para interagir com as partições:
@Entity({ name: 'pedidos' })
export class Pedido {
@PrimaryGeneratedColumn()
id: number;
@Column()
cliente_id: number;
@Column()
data_pedido: Date;
@Column('decimal')
valor: number;
}
Como Integrar SQL com NestJS
O NestJS, quando usado em conjunto com um ORM como o TypeORM, oferece uma maneira simples de trabalhar com bancos de dados SQL. O TypeORM permite que você defina suas tabelas e relações diretamente no código como classes TypeScript, facilitando a integração com SQL.
Aqui está um exemplo de como realizar uma consulta SQL simples dentro de um serviço do NestJS usando o TypeORM:
@Injectable()
export class UsuarioService {
constructor(@InjectRepository(Usuario) private usuarioRepo: Repository<Usuario>) {}
async buscarUsuariosAtivos(): Promise<Usuario[]> {
return this.usuarioRepo.find({ where: { status: 'ativo' } });
}
}
No exemplo acima, a função find()
executa uma consulta SQL equivalente a SELECT * FROM usuarios WHERE status = 'ativo'
. O TypeORM abstrai a complexidade de escrever SQL manualmente, mantendo a eficiência das consultas.
Conclusão
SQL é uma linguagem essencial para quem está começando no mundo da programação, especialmente no desenvolvimento de aplicações que envolvem o gerenciamento de dados. Conceitos como views, temporary tables, materialized views, e partições são ferramentas poderosas que ajudam a otimizar o desempenho e a organização dos dados. Quando combinado com frameworks como o NestJS, o SQL se torna ainda mais eficiente, permitindo a criação de aplicações robustas e escaláveis.
Agora que você tem uma boa noção sobre esses conceitos fundamentais de SQL, que tal começar a praticar? Se você já teve alguma experiência com SQL ou com NestJS, compartilhe conosco nos comentários! Queremos saber como você tem usado essas ferramentas no seu dia a dia.
Espero que tenha gostado deste artigo! Se você tem dúvidas ou sugestões, deixe um comentário abaixo. Estamos aqui para ajudar a construir juntos a sua jornada no mundo da programação!