Dominando o SQL Server
Dominando o SQL Server
https://Linkedin.com/in/gabrielfinelli
O SQL Server, uma criação emblemática da Microsoft, emerge como uma das soluções de
gerenciamento de banco de dados mais influentes e confiáveis disponíveis no mercado. Essa
plataforma é celebrada por sua robustez, desempenho escalável, segurança de ponta e um
conjunto abrangente de ferramentas que capacitam os DBAs a modelar, armazenar e
recuperar dados de maneira eficiente. Com recursos que suportam desde pequenas aplicações
locais até grandes soluções de análise de dados na nuvem, o SQL Server é versátil o
suficiente para atender a uma ampla gama de necessidades empresariais, tornando-se uma
escolha preferencial para organizações que buscam excelência em gerenciamento de dados.
Dominar o SQL Server não é um feito que se alcança de uma hora para outra; é uma jornada
contínua de aprendizado, descoberta e aprimoramento. À medida que a Microsoft lança
atualizações e novas versões, cada uma incorporando novas funcionalidades, melhorias de
desempenho e aprimoramentos de segurança, os DBAs devem estar em constante estado de
aprendizado e adaptação. Isso implica não apenas compreender as novidades, mas também
saber como integrá-las de forma eficaz aos sistemas existentes, como otimizar o desempenho
das bases de dados e como aproveitar as inovações tecnológicas para impulsionar a eficiência
e a competitividade organizacional.
Além da gestão técnica, os DBAs enfrentam o desafio de garantir a segurança dos dados em
um panorama onde as ameaças cibernéticas são cada vez mais sofisticadas e perigosas.
Implementar e manter estratégias de segurança robustas, realizar auditorias regulares,
configurar permissões adequadas e recuperar dados após incidentes são aspectos cruciais da
função. Isso exige uma compreensão abrangente das melhores práticas de segurança, um
compromisso inabalável com a atualização contínua e uma capacidade incansável de inovar
em face de adversidades. Portanto, o papel do DBA no manejo do SQL Server é um
equilíbrio delicado entre manter a operacionalidade, assegurar a segurança dos dados e
impulsionar a transformação digital em um ambiente empresarial em constante evolução.
Vejo este trabalho como uma contribuição modesta para simplificar processos e promover
avanços no campo da administração de bancos de dados.
Glossário:
Ao se aventurar além das consultas SQL básicas, o T-SQL oferece uma riqueza de
funcionalidades avançadas. Procedimentos armazenados, por exemplo, são conjuntos de
instruções T-SQL que você pode salvar e reutilizar, permitindo a modularidade do código, a
reutilização e a eficiência na manutenção. Eles são essenciais para encapsular lógicas de
negócios, realizar operações complexas e melhorar a segurança e o desempenho, já que o
SQL Server compila e otimiza o procedimento na primeira vez que é executado, reutilizando
o plano de execução para chamadas subsequentes.
As funções no T-SQL, sejam elas escalaras ou tabeladas, permitem aos usuários criar rotinas
que podem ser usadas em várias partes de suas consultas, proporcionando um código mais
limpo e menos repetitivo. Enquanto as funções escalares retornam um único valor, as funções
tabeladas podem retornar um conjunto de registros, como uma tabela.
Triggers, por outro lado, são respondentes automáticos a eventos específicos no banco de
dados, como inserções, atualizações ou exclusões. Eles são poderosos, mas devem ser usados
com parcimônia devido ao potencial de complicar a lógica do banco de dados e afetar o
desempenho.
A otimização de consultas é tanto uma arte quanto uma ciência, exigindo um profundo
entendimento de como o SQL Server lida com os dados. O primeiro passo é entender os
planos de execução, que são diagramas detalhados de como o SQL Server executa uma
consulta. Eles fornecem insights valiosos sobre como o motor do banco de dados acessa os
dados, usa índices, realiza junções e ordena os dados.
Os índices são fundamentais na otimização de consultas. Eles agem como sumários de livros
para o banco de dados, permitindo que o SQL Server localize rapidamente os dados sem ter
que escanear toda a tabela. No entanto, índices demais podem ser prejudiciais, pois podem
desacelerar as operações de inserção, atualização e exclusão. Portanto, a escolha e a
manutenção de índices requerem um equilíbrio cuidadoso e consideração das cargas de
trabalho do banco de dados.
As estatísticas, que o SQL Server usa para estimar a cardinalidade ou o número de linhas
únicas retornadas por consultas, são cruciais para a criação de planos de consulta eficientes.
Manter as estatísticas atualizadas é vital para garantir que o otimizador de consultas tenha as
informações mais precisas possíveis para tomar decisões sobre o plano de execução mais
eficiente.
Além disso, a reescrita de consultas pode muitas vezes resultar em melhorias significativas de
desempenho. Isso pode incluir a reestruturação de subconsultas, a eliminação de consultas
correlatas, a utilização de operações de conjunto em vez de loops cursors, e a simplificação
de lógicas complexas.
Boas práticas:
Vamos considerar um procedimento armazenado que insere um novo registro em uma tabela
e, em seguida, atualiza outra tabela com base nesse novo registro. Este exemplo ilustra o
encapsulamento de múltiplas operações em uma única unidade lógica de trabalho, garantindo
que ambas as operações sejam completadas com sucesso ou que nenhuma seja realizada
(mantendo a atomicidade).
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
-- Tratamento de erro (pode ser personalizado)
THROW;
END CATCH
END
Este procedimento armazenado demonstra o uso de transações para garantir que as operações
sejam totalmente concluídas ou revertidas em caso de erro, mantendo assim a integridade do
banco de dados.
Boas práticas:
• Evite efeitos colaterais: Funções devem ser usadas para cálculos ou transformações de
dados, não para modificar o estado do banco de dados.
• Performance: Esteja ciente do impacto no desempenho, especialmente com funções
escalares em grandes conjuntos de dados, pois elas são executadas por linha e podem
reduzir significativamente a performance.
Exemplo prático:
Imagine uma função escalar que calcula o imposto sobre um valor de venda com base em
uma taxa fixa:
Essa função pode ser usada em uma consulta para calcular o imposto sobre cada venda,
demonstrando como você pode encapsular lógicas de cálculo em funções para reutilização e
clareza do código.
Triggers são objetos de banco de dados especiais que são disparados automaticamente
quando eventos específicos ocorrem. Triggers podem ser definidos para operações de
INSERT, UPDATE e DELETE e são incrivelmente úteis para manter a integridade dos
dados, realizar auditorias e implementar regras de negócio automatizadas.
Boas práticas:
• Use com moderação: Triggers podem tornar o fluxo de dados complexo e difícil de rastrear,
especialmente em sistemas grandes. Use-os judiciosamente para manter a clareza e a
previsibilidade do comportamento do banco de dados.
• Evite lógicas complexas: Mantenha os triggers simples e focados em uma única tarefa.
Lógicas complexas em triggers podem ser difíceis de depurar e testar.
Exemplo prático:
Este trigger garante que o campo LastModified seja sempre atualizado com a data e hora
atuais sempre que um produto é modificado, automatizando a manutenção dessa informação
sem a necessidade de intervenção manual.
Otimização de Consultas: Desvendando os Planos de Execução
Boas práticas:
• Analise os planos de execução: Use o SQL Server Management Studio (SSMS) para visualizar
os planos de execução das suas consultas. Isso pode ajudar a identificar gargalos, como
varreduras de tabela completa que podem ser otimizadas com índices.
• Atenção aos operadores caros: Procure operadores que consomem uma grande parte do
custo da consulta, como varreduras de tabela, junções ineficientes ou operações de
ordenação.
Exemplo prático:
Imagine uma consulta que junta várias tabelas e possui um filtro. Um plano de execução pode
revelar que a consulta está realizando uma varredura completa em uma grande tabela, o que é
ineficiente. Adicionando um índice adequado à coluna usada no filtro, você pode transformar
essa varredura completa em uma busca indexada, reduzindo drasticamente o tempo de
execução.
Suponha que o plano de execução mostre uma varredura completa na tabela Orders.
Adicionar um índice na coluna OrderDate pode otimizar significativamente esta consulta.
-- Adicionando um índice
CREATE INDEX idx_OrderDate ON Orders(OrderDate);
Índices e Estatísticas: Pilares da Performance
Índices e estatísticas são cruciais para otimizar o desempenho das consultas. Eles ajudam o
SQL Server a encontrar rapidamente os dados que precisa, sem ter que percorrer toda a
tabela, e fornecem informações vitais para o otimizador de consultas para tomar decisões
informadas sobre o melhor plano de execução.
Boas práticas:
Exemplo prático:
Considere uma tabela Sales com milhões de registros. Sem um índice, uma consulta para
encontrar vendas em um intervalo específico de datas pode ser lenta. Ao adicionar um índice
na coluna SaleDate, a consulta pode executar significativamente mais rápido.
Após adicionar o índice, consultas que filtram pela coluna SaleDate serão muito mais
eficientes, já que o SQL Server pode agora utilizar o índice para acessar rapidamente os
registros relevantes.
CTEs:
• As CTEs proporcionam uma maneira de criar uma vista temporária que está disponível
apenas durante a execução da consulta.
• Elas são particularmente úteis para simplificar consultas complexas, especialmente aquelas
com subconsultas ou operações recursivas.
Funções de janela:
Vamos usar uma CTE para categorizar clientes com base em seu volume de compras e em
seguida utilizar uma função de janela para calcular a classificação de cada cliente dentro de
sua categoria.
WITH CustomerSpending AS (
SELECT
CustomerID,
SUM(TotalAmount) AS TotalSpending,
CASE
WHEN SUM(TotalAmount) > 10000 THEN 'High'
WHEN SUM(TotalAmount) > 5000 THEN 'Medium'
ELSE 'Low'
END AS SpendingCategory
FROM Orders
GROUP BY CustomerID
)
SELECT
CustomerID,
TotalSpending,
SpendingCategory,
RANK() OVER (PARTITION BY SpendingCategory ORDER BY TotalSpending DESC)
AS SpendingRank
FROM CustomerSpending;
Neste exemplo, a CTE CustomerSpending é usada para calcular o gasto total e a categoria de
gastos de cada cliente. Em seguida, a consulta principal usa a função de janela RANK() para
atribuir uma classificação a cada cliente dentro de sua categoria de gastos.
Boas práticas:
Imagine um sistema de e-commerce onde uma transação é usada para atualizar o estoque e
criar um registro de pedido, garantindo que ambas as operações sejam bem-sucedidas ou que
nenhuma alteração seja persistida em caso de falha.
BEGIN TRANSACTION;
UPDATE Inventory
SET Quantity = Quantity - @QuantityOrdered
WHERE ProductID = @ProductID;
IF @@ROWCOUNT = 0
BEGIN
ROLLBACK TRANSACTION;
THROW 50000, 'Produto não disponível em estoque.', 1;
END
COMMIT TRANSACTION;
Neste exemplo, a transação garante que o estoque só seja atualizado se o pedido for inserido
com sucesso. Se qualquer uma das operações falhar, a transação inteira será revertida.
O T-SQL suporta uma variedade de funções avançadas que podem ser usadas para executar
operações complexas diretamente no banco de dados. Funções como PIVOT, UNPIVOT, APPLY,
e expressões de tabela comuns (CTEs) são ferramentas poderosas para transformar e
manipular dados.
PIVOT e UNPIVOT:
• PIVOT transforma valores de várias linhas em colunas, permitindo uma visão agregada dos
dados.
• UNPIVOT faz o inverso, transformando colunas em linhas, o que pode ser útil para
normalizar dados antes de processá-los mais adiante.
• Estas operações são semelhantes aos joins, mas permitem que você use uma função
valorizada por tabela (TVF) à direita de APPLY, que pode utilizar colunas da linha atual do
lado esquerdo da cláusula APPLY.
Exemplo prático de PIVOT:
Suponha que você queira resumir vendas anuais por produto em um formato de colunas, onde
cada coluna representa um ano.
Esse exemplo demonstra como transformar linhas de dados de vendas em uma vista
agregada, onde cada coluna representa um ano diferente, facilitando a análise de tendências
ao longo do tempo.
Índices filtrados e índices columnstore são recursos avançados do SQL Server projetados
para otimizar o desempenho de consultas específicas.
Índices Filtrados:
• São úteis quando você precisa otimizar consultas para um subconjunto específico de dados.
Eles são menores e mais rápidos que os índices tradicionais porque indexam apenas as
linhas que atendem a um determinado predicado.
Índices Columnstore:
• São ideais para consultas de análise de dados, permitindo consultas muito rápidas em
grandes volumes de dados, armazenando dados de forma colunar em vez de em linhas, o
que é ótimo para operações de leitura intensiva.
Este índice filtrado é criado para otimizar consultas em um conjunto de dados onde apenas as
ordens arquivadas são frequentemente consultadas. Ele melhora o desempenho dessas
consultas e reduz o uso de espaço em disco.
Você poderia usar CTEs para organizar os dados, índices columnstore para acelerar as
consultas de análise, funções de janela para calcular médias móveis ou totais cumulativos, e
aplicar técnicas de otimização de consulta para garantir que as operações sejam realizadas de
forma eficiente.
Cada exercício é uma chance de experimentar, errar, aprender e, finalmente, expandir seu
repertório de habilidades em T-SQL. Eles são feitos para todos os níveis de proficiência,
oferecendo desafios que o ajudarão a crescer, independentemente de sua experiência ser
iniciante, intermediária ou avançada.
Então, prepare seu ambiente de desenvolvimento, afie sua mente e prepare-se para
transformar sua compreensão teórica em habilidade prática. Aceite o desafio e comece sua
jornada para se tornar um mestre em T-SQL!
Exercícios Práticos
Práticas recomendadas:
• Ajuste de memória: Certifique-se de alocar memória suficiente para o SQL Server, mas deixe
memória suficiente para o sistema operacional e outros aplicativos. A utilização do
sp_configure para ajustar o max server memory é essencial.
• Configurações de processador: Ajuste o paralelismo e a afinitização de CPU para otimizar o
uso do processador, especialmente em sistemas com múltiplos núcleos.
• Configurações de rede: Configure as opções de rede para otimizar a comunicação entre o
SQL Server e as aplicações, ajustando parâmetros como o tamanho do pacote de rede.
Práticas recomendadas:
Ajuste de Desempenho
Práticas recomendadas:
Práticas recomendadas:
• Backup completo: Realize backups completos regularmente para garantir que você tenha
uma cópia íntegra de todo o banco de dados.
• Backup diferencial e de log de transações: Implemente backups diferenciais e de log de
transações para minimizar a perda de dados e permitir a recuperação até um ponto
específico no tempo.
• Teste de restauração: Teste regularmente os procedimentos de restauração para garantir
que os backups possam ser restaurados com sucesso em caso de emergência.
Manter a alta disponibilidade e garantir uma estratégia eficaz de recuperação de desastres são
fundamentais para qualquer sistema de banco de dados. No SQL Server, várias tecnologias e
abordagens podem ser implementadas para atingir esses objetivos.
Práticas recomendadas:
As instâncias de cluster de failover do SQL Server fornecem alta disponibilidade para bancos
de dados, permitindo que o serviço do SQL Server seja executado em vários nós de um
cluster do Windows Server Failover Clustering (WSFC). Em caso de falha de hardware ou
software em um nó, o serviço do SQL Server pode ser rapidamente transferido para outro nó,
minimizando o tempo de inatividade.
Práticas recomendadas:
Além do Always On e das instâncias de cluster de failover, o SQL Server suporta outras
tecnologias de alta disponibilidade, como espelhamento de banco de dados, replicação e log
shipping. Cada uma dessas tecnologias oferece diferentes níveis de proteção de dados,
desempenho e complexidade.
Práticas recomendadas:
A otimização de desempenho no SQL Server é uma arte que combina expertise técnica com
um entendimento profundo das necessidades de negócios. Além dos ajustes básicos, a
otimização avançada pode incluir:
Backups são essenciais, mas sua estratégia pode ir além das práticas padrão, incorporando:
• Backup de Filegroups: Se você tem um banco de dados muito grande, considere usar o
backup de filegroups. Isso permite que você restaure apenas uma parte do banco de dados,
o que pode ser importante para minimizar o tempo de inatividade em caso de corrupção ou
perda de dados.
• Backup em Nuvem: Integrar soluções de backup na nuvem pode oferecer maior flexibilidade
e segurança. Isso pode ser particularmente útil para garantir que os backups estejam off-
site, protegidos contra desastres locais.
Automação de Manutenção
Automatizar tarefas de manutenção regulares é vital para garantir a saúde a longo prazo do
banco de dados:
• Agendamento de Jobs: Use o SQL Server Agent para agendar jobs de manutenção, como
reconstrução de índices, atualizações de estatísticas e verificações de integridade.
• Scripts de Manutenção Personalizados: Desenvolva scripts que atendam às necessidades
específicas do seu ambiente, automatizando tarefas como limpeza de logs, monitoramento
de espaço em disco e otimização de índices.
Explorar a fundo os Always On Availability Groups revela capacidades que podem ser
cruciais para a continuidade dos negócios:
As instâncias de cluster de failover (FCI) são ideais para proteger seu banco de dados contra
falhas de hardware. Aprofundar-se nelas significa:
Suponha que você tenha uma tabela de vendas (SalesTable) com milhões de registros. O
particionamento pode ser implementado para melhorar o desempenho das consultas e a
eficiência da manutenção. Você pode particionar essa tabela com base no ano da venda
(SaleYear):
Isso permitirá que as consultas que filtram pelo SaleYear sejam mais eficientes, pois o SQL
Server buscará apenas os dados no partição relevante.
Utilização da Compressão de Dados
Imagine uma tabela grande, LogData, que acumula registros de log rapidamente. A
compressão de dados pode reduzir seu tamanho e melhorar o desempenho da leitura:
Isso aplica compressão de linha, ideal para tabelas com muitas variações em tamanhos de
linha ou para tabelas que são frequentemente acessadas mas raramente modificadas.
Se seu banco de dados está particionado em filegroups, você pode realizar backup e
restauração de um filegroup específico. Isso é útil para grandes bancos de dados onde o
backup completo é muito demorado:
Esse comando faz backup apenas do filegroup ReadOnlyFileGroup, que pode ser uma
estratégia eficiente se esse filegroup contém dados históricos que raramente mudam.
Backup em Nuvem
Para integrar backups com soluções na nuvem, como o Azure Blob Storage, você
configuraria o seguinte:
Este exemplo mostra como fazer um backup diretamente para o Azure Blob Storage,
utilizando a compressão para economizar espaço e largura de banda.
Vamos supor que você queira configurar um grupo de disponibilidade que inclui um servidor
primário e dois secundários para um banco de dados crítico chamado CriticalDatabase:
Realize simulações periódicas de desastres para testar a eficácia do seu plano. Isso pode
envolver:
• Desligar o Servidor Primário: Simule uma falha no servidor primário e observe se o failover
automático ocorre sem problemas para um dos servidores secundários.
• Restaurar Backups: Regularmente teste a restauração de backups em um ambiente de teste
para garantir que os dados possam ser recuperados conforme esperado em caso de
desastre.
Ao fornecer esses exemplos detalhados, nosso objetivo é ilustrar como você pode aplicar
técnicas avançadas de administração de SQL Server para otimizar o desempenho, garantir a
segurança dos dados e maximizar a disponibilidade do sistema. Essas estratégias são
fundamentais para o gerenciamento eficaz de bancos de dados em ambientes críticos e de alta
demanda.
Profundezas do Partitioning
O particionamento de tabelas no SQL Server é uma técnica poderosa para gerenciar grandes
volumes de dados. Vamos considerar uma tabela de transações (Transactions) que cresce
continuamente ao longo do tempo. Implementar o particionamento pode ajudar a melhorar o
desempenho de consulta e facilitar a manutenção.
O esquema de partição mapeia as partições para filegroups. Embora este exemplo use o
filegroup [PRIMARY], em um ambiente de produção, você pode mapear partições para
diferentes filegroups para otimizar o desempenho e facilitar a manutenção.
A compressão de dados pode ser uma maneira eficaz de reduzir o tamanho físico do banco de
dados e melhorar o desempenho de E/S, especialmente para bancos de dados grandes.
Backups são cruciais, mas a estratégia de backup avançada vai além da execução de backups
regulares, envolvendo a otimização da estratégia de backup para atender às necessidades
específicas do ambiente.
Isso cria um backup que contém apenas as alterações desde o último backup completo,
reduzindo o tempo de backup e de restauração.
Automação e Monitoramento de Backup
A administração avançada do SQL Server requer uma abordagem meticulosa, onde cada
detalhe é considerado para otimizar o desempenho, garantir a segurança dos dados e
maximizar a disponibilidade. Essas estratégias detalhadas fornecem uma fundação sólida para
gerenciar ambientes de banco de dados complexos e de alta demanda, garantindo que o
sistema esteja preparado para atender às necessidades atuais e futuras do negócio.
Você acabou de explorar conceitos avançados e estratégias fundamentais que são cruciais
para a administração eficaz de bancos de dados SQL Server. Mas, como bem sabem os
profissionais experientes, o verdadeiro domínio surge não apenas entendendo teorias, mas
aplicando-as. Agora é sua chance de mergulhar, experimentar e aprimorar suas habilidades de
maneira prática e tangível!
Os 10 exercícios práticos que preparamos são mais do que simples tarefas; são uma jornada
para aprofundar seu entendimento, testar suas habilidades e expandir sua competência no
mundo real do SQL Server. Cada exercício é uma oportunidade para enfrentar desafios
semelhantes aos que você encontrará em ambientes de produção, permitindo-lhe:
1. Configuração de Instância:
o Pratique a alteração da configuração de memória do SQL Server utilizando o
sp_configure. Defina o max server memory para um valor adequado
considerando o total de RAM disponível no servidor.
2. Monitoramento de Desempenho:
o Utilize o Dynamic Management Views (DMVs) para identificar as 5 consultas
mais lentas em seu banco de dados. Analise o plano de execução de cada uma
e identifique oportunidades de otimização, como a adição de índices.
3. Implementação de Particionamento:
o Crie uma tabela de testes que inclua particionamento por data. Implemente
uma função de partição que divida os dados por trimestre e realoque os dados
existentes para se alinharem com o esquema de partição apropriado.
4. Simulação de Backup e Restauração:
o Realize um backup completo de um banco de dados de teste. Em seguida,
simule uma falha deletando o banco de dados (assegure-se de ter o backup!) e
restaure o banco de dados a partir do backup.
5. Exploração de Always On Availability Groups:
o Configure um ambiente de laboratório com Always On Availability Groups.
Inclua um servidor primário e dois secundários, realize a configuração e
simule um failover manual entre os servidores.
6. Prática de Recuperação de Desastres:
o Desenvolva um cenário de desastre e um plano de recuperação. Simule o
desastre (por exemplo, perda de dados, falha do servidor) e tente restaurar o
banco de dados para um ponto específico no tempo usando backups de log de
transação.
7. Análise e Ajuste de Índices:
o Revise os índices em um banco de dados existente, utilizando o DMV para
encontrar índices ausentes, índices não utilizados ou índices duplicados.
Implemente as mudanças sugeridas em um ambiente de teste para avaliar o
impacto no desempenho.
8. Automação de Tarefas de Manutenção:
o Escreva um script do SQL Server Agent Job para automatizar a rotina de
reconstrução de índices e atualização de estatísticas, agendando-o para
executar durante uma janela de manutenção de baixa atividade.
9. Configuração de Alertas para Monitoramento:
o Configure alertas do SQL Server para notificá-lo sobre condições críticas,
como espaço em disco baixo, bloqueio de transações ou falhas de job do SQL
Server Agent, utilizando o SQL Server Agent ou um sistema de
monitoramento externo.
A autenticação é o primeiro passo para proteger o acesso ao seu servidor SQL Server. Há
dois modos principais:
Exemplo Prático:
Configurando a autenticação do Windows: Crie um login usando uma conta do Active Directory e
conceda permissões específicas:
Autorização
Após autenticar um usuário, o SQL Server utiliza a autorização para definir o que o usuário
pode fazer. Isso é gerenciado por:
• Permissões: Direitos específicos concedidos a um usuário, como SELECT, INSERT, UPDATE,
DELETE em tabelas específicas.
• Funções: Grupos predefinidos ou personalizados que contêm permissões específicas.
Exemplo Prático:
Criptografia
Exemplo Prático:
USE master;
CREATE CERTIFICATE MyServerCert WITH SUBJECT = 'My DEK Certificate';
USE myDatabase;
CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 ENCRYPTION BY
SERVER CERTIFICATE MyServerCert;
ALTER DATABASE myDatabase SET ENCRYPTION ON;
Auditoria
Exemplo Prático:
USE master;
CREATE SERVER AUDIT MyServerAudit TO FILE ( FILEPATH = 'C:\Audits\' );
ALTER SERVER AUDIT MyServerAudit WITH (STATE = ON);
USE myDatabase;
CREATE DATABASE AUDIT SPECIFICATION MyDatabaseAudit
FOR SERVER AUDIT MyServerAudit
ADD (SELECT ON SCHEMA::dbo BY public);
ALTER DATABASE AUDIT SPECIFICATION MyDatabaseAudit WITH (STATE = ON);
Exemplo Prático:
• Além de conceder e revogar permissões básicas, o SQL Server permite o controle granular
sobre as operações específicas que os usuários podem executar, incluindo permissões a
nível de coluna e a capacidade de definir permissões em objetos específicos como
procedimentos armazenados ou funções.
• TDE é uma medida de segurança essencial para proteger dados em repouso. Ele
criptografa os arquivos de banco de dados no nível do arquivo, o que significa que os
dados ou backups capturados não podem ser lidos sem a chave de criptografia
adequada.
• Considerações de Desempenho: Embora o TDE proteja contra várias ameaças, pode
haver um impacto no desempenho, que deve ser monitorado, especialmente em
sistemas com I/O intensivo.
Implementação de Auditoria:
• SQL Server oferece opções de auditoria detalhadas que podem ser configuradas para
capturar uma variedade de eventos, desde acesso a dados sensíveis até alterações de
configuração ou esquema, ajudando a satisfazer requisitos de conformidade e
segurança.
• Auditoria de Acesso a Dados Sensíveis: É vital configurar auditorias que registrem
quem acessou informações sensíveis, o que pode ajudar em investigações de
segurança e conformidade regulatória.
Autenticação Integrada:
Criptografia Extensa
Criptografia de Transporte:
Habilitar o Always Encrypted com enclaves seguros para uma coluna sensível:
Auditoria Detalhada
• A auditoria pode ser configurada tanto no nível do servidor quanto do banco de dados,
permitindo um controle granular sobre as ações monitoradas. Isso inclui a auditoria de
acesso a objetos sensíveis, alterações de permissão, e modificações de esquema.
Estabeleça uma auditoria que rastreie alterações de segurança e acesso a dados sensíveis:
sql
CREATE SERVER AUDIT HighSecurityAudit
TO FILE (FILEPATH = 'D:\SQLAudits\', MAXSIZE = 500 MB);
ALTER SERVER AUDIT HighSecurityAudit WITH (STATE = ON);
• Manter a conformidade não é uma atividade única, mas um processo contínuo. Isso inclui
revisões periódicas da configuração de segurança, auditorias de conformidade regulares, e
adaptação às novas regulamentações de proteção de dados.
Exercícios Práticos
• Ajuste as configurações de memória máxima e de afinidade de CPU para garantir que o SQL
Server tenha recursos suficientes para atender às demandas de carga de trabalho.
Configurações de Armazenamento:
Otimização de Índices
• Use o Database Engine Tuning Advisor para identificar índices ausentes ou subutilizados e
implemente as recomendações para melhorar o desempenho das consultas.
• Evite consultas ad-hoc geradas dinamicamente pela aplicação, pois elas podem levar a
planos de execução subótimos e ao uso excessivo de recursos.
• Utilize o Activity Monitor do SSMS para visualizar informações em tempo real sobre
atividades de servidor, bloqueios, esperas e estatísticas de uso de recursos.
Soluções de Terceiros
SQL Sentry:
• Use ferramentas como o SQL Sentry para monitorar o desempenho de consultas, rastrear
alterações de esquema e planejar a capacidade do servidor com base em análises de
tendências.
• Use o Query Store para identificar consultas com alto tempo de execução, alto número de
leituras ou altos recursos de CPU.
• Analise os planos de execução das consultas lentas para identificar operações custosas,
como scans de tabela ou índices ausentes.
Otimização de Consultas:
Configuração de Alertas:
• Configure alertas no SQL Server Agent para monitorar métricas importantes, como uso de
CPU, consumo de memória e tempo de resposta de consulta.
Definição de Thresholds:
• Defina thresholds para os alertas com base nos padrões de desempenho aceitáveis e receba
notificações quando os thresholds forem ultrapassados.
• Utilize o SQL Server Management Studio para monitorar o espaço em disco disponível para
bancos de dados e arquivos de log.
Uso de Índices
• Utilize o SQL Server Management Studio para analisar o plano de execução de consultas
lentas e identificar se estão sendo feitos scans de tabela ou índices ausentes.
• Suponha que uma consulta comum esteja fazendo um scan de tabela em uma coluna
"LastName" na tabela "Customers". Podemos criar um índice para essa coluna:
sql
• CREATE INDEX idx_LastName ON dbo.Customers(LastName);
•
Reescrita de Consultas
Eliminação de Subconsultas:
-- Original
SELECT * FROM Orders WHERE CustomerID IN (SELECT CustomerID FROM
Customers WHERE Country = 'USA');
-- Reescrito
SELECT o.* FROM Orders o INNER JOIN Customers c ON o.CustomerID =
c.CustomerID WHERE c.Country = 'USA';
WITH SalesByCustomer AS (
SELECT CustomerID, SUM(TotalAmount) AS TotalSales
FROM Orders
GROUP BY CustomerID
)
SELECT * FROM SalesByCustomer WHERE TotalSales > 10000;
Além das ferramentas nativas do SQL Server, existem várias soluções de terceiros que
oferecem recursos avançados de monitoramento e diagnóstico. Vamos explorar algumas
dessas soluções e discutir como elas podem ser usadas para identificar e resolver problemas
de desempenho em tempo real.
Ferramentas de Terceiros
Spotlight da Quest:
• Utilize o Spotlight para analisar o histórico de bloqueios e identificar padrões que possam
indicar problemas de concorrência no servidor SQL Server.
Suponha que tenhamos uma consulta comum que está sendo executada lentamente devido a
uma varredura completa de tabela. Vamos identificar o problema e aplicar uma solução de
otimização usando índices.
SELECT * FROM Orders WHERE OrderDate >= '2023-01-01' AND OrderDate <=
'2023-12-31';
Identificação do Problema:
• A consulta está realizando uma varredura completa da tabela "Orders" para encontrar
registros com datas de pedido dentro de um intervalo específico.
• Criar um índice na coluna "OrderDate" para acelerar a busca por registros dentro do
intervalo de datas especificado.
Após a criação do índice, a consulta agora pode usar o índice para localizar rapidamente os
registros dentro do intervalo de datas, resultando em um desempenho significativamente
melhorado.
• Em casos específicos, pode ser necessário forçar um plano de execução de consulta usando
a cláusula OPTION (FORCE ORDER) ou criando planos de execução fixos usando planos de
execução guardados.
Exemplo Prático:
sql
SELECT * FROM Orders WHERE CustomerID = 100 OPTION (FORCE ORDER);
Monitoramento e Otimização de Recursos
Exemplo Prático:
• Utilize o Execution Plan no SQL Server Management Studio para analisar o plano de
execução de consultas e identificar operações que podem ser otimizadas.
• Crie índices compostos para cobrir consultas complexas e use colunas incluídas para evitar a
necessidade de consultas ao índice principal.
Exemplo Prático:
Extended Events:
Exemplo Prático:
• Configure uma sessão estendida para capturar consultas que excedam um determinado
tempo de execução:
sql
CREATE EVENT SESSION CaptureLongRunningQueries ON SERVER
ADD EVENT sqlserver.sql_statement_completed (
WHERE ([duration] > 1000) -- Tempo em milissegundos
)
Análise de Estatísticas de Desempenho
Exemplo Prático:
Suponha que uma consulta frequente esteja apresentando um desempenho abaixo do esperado
devido a um plano de execução subótimo. Vamos explorar como podemos analisar o plano de
execução e aplicar ajustes para melhorar o desempenho da consulta.
Consulta Original:
SELECT * FROM Orders WHERE OrderDate >= '2023-01-01' AND OrderDate <=
'2023-12-31';
• Use o Execution Plan no SSMS para analisar o plano de execução da consulta e identificar
quais operações estão consumindo recursos significativos.
Consulta Otimizada:
Após aplicar o ajuste de consulta, reanalise o plano de execução para garantir que as
mudanças resultaram em um plano mais eficiente e, consequentemente, em um melhor
desempenho da consulta.
• Escolha cuidadosamente entre operadores de junção como INNER JOIN, LEFT JOIN e CROSS
JOIN para garantir que a consulta use a estratégia de junção mais eficiente para a situação
específica.
Exemplo Prático:
SELECT *
FROM Orders o
INNER JOIN Customers c ON o.CustomerID = c.CustomerID
WHERE o.OrderDate >= '2023-01-01' AND o.OrderDate <= '2023-12-31';
Ajuste de Consultas de Grupos de Dados Grandes
Paginação Eficiente:
• Utilize a cláusula OFFSET FETCH ou a função de janela ROW_NUMBER() para paginar grandes
conjuntos de dados de forma eficiente.
Exemplo Prático:
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNum
FROM Orders
) AS SubQuery
WHERE RowNum BETWEEN 1 AND 10;
Otimização de Consultas com Funções Escalares
• Evite o uso de funções escalares em colunas de índice, pois isso pode impedir o uso eficiente
do índice.
Exemplo Prático:
SELECT *
FROM Orders
WHERE YEAR(OrderDate) = 2023;
Monitoramento: Diagnóstico em Tempo Real
Monitoramento Avançado de Consultas
Exemplo Prático:
SELECT *
FROM Orders
WHERE OrderID = 100
OPTION (QUERYTRACEON 3604, QUERYTRACEON 8606, QUERYTRACEON 8619);
Captura de Eventos de Bloqueio
Exemplo Prático:
Os índices columnstore são uma estrutura de índice avançada que pode melhorar
significativamente o desempenho de consultas em tabelas grandes. Vamos explorar como
podemos utilizar os índices columnstore para otimizar o desempenho de uma consulta
complexa.
Consulta Original:
Após a criação do índice columnstore, a consulta original pode se beneficiar de uma leitura
de dados mais eficiente, resultando em um desempenho significativamente melhorado.
• Utilize índices filtros para criar índices especializados em colunas que são frequentemente
filtradas com valores específicos.
Exemplo Prático:
• Quebre consultas complexas em etapas menores usando Common Table Expressions (CTEs)
ou tabelas temporárias para melhorar a legibilidade e o desempenho.
Exemplo Prático:
WITH CTE_Products AS (
SELECT ProductID, ProductName FROM Products WHERE CategoryID = 1
)
SELECT * FROM Orders o INNER JOIN CTE_Products p ON o.ProductID =
p.ProductID;
Ajuste Fino de Estatísticas
Exemplo Prático:
Exemplo Prático:
SELECT *
FROM sys.query_store_query q
JOIN sys.query_store_plan p ON q.query_id = p.query_id;
Monitoramento de Bloqueios em Tempo Real
• Configure uma sessão estendida para capturar eventos de bloqueio em tempo real e
identificar rapidamente problemas de bloqueio.
Exemplo Prático:
Os índices columnstore são ideais para consultas analíticas em tabelas grandes. Vamos
explorar como podemos criar e utilizar um índice columnstore para otimizar consultas de
análise de dados.
Consulta Analítica:
Particionamento de Dados
O particionamento de dados é uma técnica que divide grandes conjuntos de dados em partes
menores, chamadas partições, para melhorar o desempenho e a eficiência das consultas. Isso
é especialmente útil em sistemas com volumes de dados massivos ou requisitos de retenção
de dados específicos.
Exemplo: Em um sistema de registro de logs, os dados podem ser particionados por mês ou
por ano. Isso permite que consultas sejam direcionadas apenas para as partições relevantes,
reduzindo o tempo de pesquisa e melhorando o desempenho geral do sistema.
Exemplo: Uma organização que possui vários aplicativos com bancos de dados separados
pode consolidá-los em uma única instância do SQL Server. Isso permite compartilhar
recursos de hardware e reduzir a sobrecarga administrativa associada à gestão de múltiplas
instâncias.
Exemplo: Uma empresa pode implantar várias instâncias do SQL Server em VMs usando
uma plataforma de virtualização como VMware ou Hyper-V. Isso permite que recursos de
hardware sejam compartilhados dinamicamente entre as instâncias, conforme necessário, e
facilita a escalabilidade horizontal e vertical.
Estratégias Avançadas de Arquitetura e Planejamento de Capacidade
Arquitetura de Nuvem
Exemplo: Uma empresa que experimenta picos de tráfego sazonal pode usar a elasticidade
da nuvem para escalar automaticamente a capacidade do banco de dados durante períodos de
alta demanda e reduzi-la quando a demanda diminui.
Contêineres Docker
Planejamento de Sistemas
Consolidação e Virtualização
Exemplo de Consulta: Suponha que tenhamos várias bases de dados de clientes separadas
em diferentes servidores. Podemos consolidar esses bancos de dados em um único servidor e
usar consultas para gerenciar os dados de forma centralizada. Por exemplo:
Nesse exemplo, a tabela CustomerData está centralizada em um único banco de dados após a
consolidação, permitindo consultas eficientes para recuperar dados de clientes de forma
unificada.
Essa consulta nos fornece informações sobre a utilização de CPU e memória no servidor,
ajudando a avaliar se é necessário adicionar mais recursos ao servidor (dimensionamento
vertical) ou distribuir a carga entre vários servidores (dimensionamento horizontal).
Estratégias de Escalabilidade
Essa consulta nos fornece estatísticas sobre o desempenho de consultas em uma tabela
particionada, permitindo-nos identificar consultas que podem se beneficiar de otimizações
adicionais ou ajustes na estratégia de particionamento.
Planejamento de Sistemas
Modelagem Dimensional para Data Warehouses
Exemplo de Consulta:
Neste exemplo, utilizamos uma consulta para calcular as vendas mensais por região a partir
de um data warehouse que utiliza modelagem dimensional.
O particionamento de tabelas é uma técnica avançada que divide fisicamente uma tabela em
partes menores, chamadas de partições, com base em critérios como intervalos de valores de
colunas ou datas. Isso permite otimizar o desempenho de consultas e operações de
manutenção em tabelas muito grandes.
Exemplo de Consulta:
Essa consulta fornece estatísticas sobre a distribuição de dados em partições de uma tabela
específica, ajudando os administradores de banco de dados a avaliar a eficácia do
particionamento e identificar possíveis problemas de desempenho.
Consolidação e Virtualização
Migração para Plataformas de Nuvem
A migração de bancos de dados para plataformas de nuvem, como Microsoft Azure SQL
Database ou Amazon RDS, é uma estratégia comum para consolidar e virtualizar ambientes
de banco de dados. Isso permite reduzir custos operacionais, simplificar a gestão e aproveitar
recursos de escalabilidade e disponibilidade oferecidos pela nuvem.
Exemplo de Consulta:
-- Consulta para migrar um banco de dados local para o Azure SQL Database
CREATE DATABASE SCOPY SalesDB TO 'DestinationAzureServer';
Essa consulta demonstra o uso do serviço "Azure Database Migration Service" para migrar
um banco de dados local para o Microsoft Azure SQL Database, facilitando a consolidação e
virtualização de ambientes de banco de dados.
A virtualização por meio de contêineres Docker oferece uma alternativa leve e flexível para a
consolidação de ambientes de banco de dados. Os contêineres permitem encapsular o banco
de dados e suas dependências em um ambiente isolado, facilitando a implantação e o
gerenciamento em diferentes plataformas.
Exemplo de Consulta:
Essa consulta exemplifica como criar um contêiner Docker com o SQL Server,
proporcionando uma abordagem moderna e flexível para a consolidação e virtualização de
ambientes de banco de dados.
Considerações Avançadas de Planejamento de Capacidade
Escalabilidade Elástica
Exemplo de Consulta:
Nesta consulta, estamos configurando um banco de dados no Microsoft Azure SQL Database
para utilizar um pool elástico, que ajusta automaticamente os recursos com base na carga de
trabalho.
Exemplo de Consulta:
Nesta consulta, estamos criando uma especificação de auditoria para monitorar o uso de
armazenamento em um banco de dados e gerar alertas automáticos quando o limite de
armazenamento definido for atingido.
Integração e Migração de Dados com SQL Server
O SQL Server Integration Services (SSIS) é uma plataforma de ETL poderosa e flexível
fornecida pela Microsoft como parte do conjunto de ferramentas do SQL Server. Com o
SSIS, os desenvolvedores e administradores de banco de dados podem criar pacotes de
integração para extrair dados de diversas fontes, transformá-los conforme necessário e
carregá-los em destinos específicos.
Exemplo Prático: Imagine que você precise extrair dados de um banco de dados SQL
Server, transformá-los para substituir valores nulos por padrões específicos e, em seguida,
carregá-los em uma planilha do Excel. Você poderia criar um pacote SSIS com uma fonte de
dados SQL Server, transformações para substituir valores nulos e um destino Excel.
Exemplo Prático: Suponha que você precise migrar dados de um banco de dados local para
o Azure SQL Database. Você pode usar o Azure Database Migration Service (DMS) para
facilitar essa migração com o mínimo de interrupção. Aqui está um exemplo de como
configurar e executar uma migração com o Azure DMS:
Estratégias Avançadas
Incremental Load
Em muitos cenários de ETL, é comum lidar com grandes volumes de dados que não mudam
com frequência. Nesses casos, uma estratégia de carga incremental pode ser empregada, onde
apenas os dados que foram adicionados ou modificados desde a última carga são processados
novamente.
Exemplo Prático: Suponha que você tenha um processo de ETL que carrega dados de
vendas diariamente. Em vez de recarregar todos os dados todas as vezes, você pode usar uma
consulta SQL para extrair apenas os registros com datas de venda mais recentes do que a
última carga.
A Change Data Capture (CDC) é uma tecnologia que captura as alterações feitas em tabelas
de banco de dados de forma incremental. Isso permite que você identifique facilmente quais
registros foram inseridos, atualizados ou excluídos desde a última carga de dados, facilitando
a implementação de processos de ETL eficientes.
Exemplo Prático: Suponha que você esteja usando o CDC em um banco de dados SQL
Server para capturar alterações em uma tabela de clientes. Você pode consultar as tabelas de
controle do CDC para obter as alterações mais recentes e usá-las como entrada para o
processo de ETL.
Exemplo Prático: Suponha que você esteja carregando dados de várias fontes em um data
warehouse usando um pacote SSIS. Você pode configurar o SSIS para executar várias tarefas
de carregamento em paralelo, distribuindo a carga entre os núcleos de CPU disponíveis e
acelerando o processo de carga.
O SSIS permite executar tarefas de ETL com base em condições específicas usando
contêineres condicionais e expressões condicionais. Isso é útil para lidar com cenários
complexos onde certas etapas do processo devem ser executadas apenas sob determinadas
condições.
O processamento em lote é uma técnica eficaz para lidar com grandes volumes de dados
durante a migração. Isso envolve dividir o processo em lotes menores e processá-los de forma
incremental para evitar sobrecarga no sistema e minimizar o impacto no desempenho.
1. Transformação de Dados com SSIS: Desenvolva um pacote SSIS que extraia dados
de uma tabela de vendas, aplique uma transformação para calcular o total de vendas
por cliente e carregue os resultados em uma nova tabela de resumo.
2. Migração Incremental: Crie um script SQL que migre dados de uma tabela de
produtos, identificando apenas os registros que foram adicionados ou atualizados
desde a última migração, e os carregue em uma tabela de destino.
3. Uso de Tabelas Temporárias: Implemente um processo de migração usando tabelas
temporárias para limpar e padronizar os dados antes de carregá-los em uma tabela de
destino.
4. Processamento em Lote: Escreva um procedimento armazenado que processe dados
em lotes de 1000 registros por vez, removendo-os de uma tabela de origem e
carregando-os em uma tabela de destino.
5. Paralelização de Tarefas de Migração: Configure um pacote SSIS para paralelizar
as tarefas de ETL, dividindo o processo de migração em várias tarefas executadas
simultaneamente.
6. Validação de Dados: Crie um fluxo de dados no SSIS que valide os dados de uma
tabela de clientes, identificando registros com valores nulos em campos obrigatórios e
os enviando para um arquivo de log de erros.
7. Migração para o Azure SQL Database: Use o Azure Database Migration Service
para migrar um banco de dados SQL Server local para o Azure SQL Database,
minimizando o tempo de inatividade durante o processo.
8. Implementação de CDC: Configure a Change Data Capture (CDC) em uma tabela
de produtos no SQL Server e crie um procedimento armazenado que consulta as
alterações capturadas desde a última migração.
9. Agendamento de Tarefas de Migração: Crie um trabalho do SQL Server Agent que
execute automaticamente um pacote SSIS de migração de dados em uma
programação específica, como todas as noites às 2h da manhã.
10. Monitoramento de Migrações: Desenvolva consultas SQL que monitorem o
progresso e o desempenho das migrações de dados em execução, fornecendo
informações sobre o tempo de execução, o volume de dados processado e possíveis
erros encontrados.
Queridos leitores,
Chegar ao fim desta jornada pelo universo do SQL Server é um momento de grande gratidão
para mim. Ao longo das páginas deste livro, meu objetivo foi compartilhar com vocês todo o
conhecimento e experiência que adquiri sobre essa poderosa ferramenta de banco de dados.
Agradeço sinceramente por terem dedicado seu tempo e esforço para explorar os tópicos
abordados neste livro. Espero que as informações fornecidas tenham sido úteis e que tenham
encontrado respostas para suas dúvidas e desafios relacionados ao SQL Server.
À medida que concluímos esta jornada juntos, quero encorajá-los a continuarem explorando e
aprofundando seus conhecimentos. A tecnologia está em constante evolução, e o aprendizado
contínuo é essencial para acompanhar essas mudanças.
Que as habilidades e conhecimentos adquiridos ao longo deste livro possam servi-los bem em
suas carreiras e projetos futuros. Que vocês possam enfrentar os desafios com confiança e
alcançar o sucesso em suas jornadas pessoais e profissionais.
Uma vez mais, meu sincero agradecimento por me acompanharem nesta jornada. Desejo a
todos vocês o melhor em seus empreendimentos futuros.
Com gratidão,
Esta consulta seleciona o nome e a data de contratação dos funcionários contratados durante o
ano de 2023.
Esta consulta retorna os cargos únicos dos funcionários na tabela Funcionarios, eliminando
quaisquer duplicatas usando DISTINCT.
Usando a função CONCAT(), esta consulta cria uma coluna chamada NomeCompleto, que
combina o primeiro nome e o sobrenome dos clientes em uma única string.
Nesta consulta, multiplicamos o preço unitário pelo quantidade de itens para calcular o total
de cada item no pedido.
Esta consulta retorna os nomes e sobrenomes dos clientes que não possuem um endereço de
e-mail registrado na tabela Clientes.
Usando IFNULL(), esta consulta substitui os valores nulos na coluna Telefone por 'N/A',
garantindo que todos os contatos tenham um número de telefone exibido.
SELECT Departamento, AVG(CASE WHEN Salario > 50000 THEN Salario ELSE NULL
END) AS MediaSalario
FROM Funcionarios
GROUP BY Departamento;
Neste exemplo, calculamos a média de salários apenas para os funcionários com salários
superiores a 50.000, utilizando uma expressão condicional dentro da função AVG().
SELECT Nome
FROM Produtos
ORDER BY Preco DESC
LIMIT 5 OFFSET 10;
Esta consulta retorna os nomes dos produtos, ordenados pelo preço em ordem decrescente,
exibindo apenas os resultados da posição 11 à 15.
Esta consulta conta o número de categorias distintas na tabela Produtos, utilizando COUNT()
com DISTINCT.
Neste exemplo de junção externa, combinamos os pedidos com os clientes, garantindo que
todos os pedidos sejam incluídos, mesmo que não haja correspondência na tabela Clientes.
SELECT Nome,
CONCAT(IF(Sexo = 'M', 'Sr.', 'Sra.'), ' ', Sobrenome) AS Tratamento
FROM Clientes;
Esta consulta cria uma coluna chamada Tratamento, que concatena o tratamento adequado
('Sr.' ou 'Sra.') com o sobrenome dos clientes, dependendo de seu sexo.
SELECT Nome,
CASE
WHEN Salario >= 50000 THEN 'Alto'
WHEN Salario >= 30000 THEN 'Médio'
ELSE 'Baixo'
END AS FaixaSalarial
FROM Funcionarios;
Neste exemplo, classificamos os funcionários em diferentes faixas salariais com base em seus
salários usando a cláusula CASE.
Aqui, substituímos 'Rua' por 'Av.' na coluna Endereco usando a função REPLACE(), criando
uma versão formatada do endereço.
Esta consulta retorna combinações únicas de países e cidades dos clientes, garantindo que
cada combinação seja única usando DISTINCT.
Esta consulta seleciona os nomes e cargos dos funcionários que têm cargos de gerente ou
supervisor na tabela Funcionarios.
Aqui, calculamos o salário com um aumento de 10% para cada funcionário, multiplicando o
salário por 1.1.
SELECT Nome
FROM Clientes
ORDER BY BINARY Nome ASC;
Esta consulta ordena os nomes dos clientes de forma case-sensitive, levando em consideração
letras maiúsculas e minúsculas.
SELECT *
FROM Produtos
WHERE Categoria NOT IN ('Eletrônicos', 'Roupas');
Nesta consulta, selecionamos todos os produtos cuja categoria não seja Eletrônicos ou
Roupas na tabela Produtos.
Usando SUBSTRING(), extraímos os primeiros três dígitos do número de telefone para obter
o código de área dos contatos.
Neste exemplo, concatenamos a cidade, o estado (se disponível) e o país dos endereços dos
clientes, tratando os valores nulos do estado com 'Desconhecido' usando IFNULL().
Aqui, calculamos o total de vendas por ano e mês, incluindo uma linha adicional com o total
geral usando a cláusula WITH ROLLUP.
Esta consulta seleciona os nomes e salários dos funcionários que ocupam o cargo de analista
e têm um salário superior a 30.000.
SELECT *
FROM Pedidos
WHERE Status IN ('Pendente', 'Em Processo');
Aqui, para cada funcionário, recuperamos a média de salário de seu departamento utilizando
uma subconsulta correlacionada.
Esta consulta retorna os cargos únicos dos funcionários, ordenados de acordo com uma
ordem específica ('Gerente', 'Supervisor', 'Analista', 'Assistente').
SELECT Nome
FROM Clientes
WHERE ClienteID NOT IN (SELECT ClienteID FROM Pedidos);
Neste exemplo, selecionamos os nomes dos clientes que ainda não fizeram nenhum pedido,
usando uma subconsulta para identificar os clientes com base no ClienteID.
Aqui, classificamos os jogadores com base em sua pontuação, atribuindo uma classificação
personalizada e limitando os resultados aos 10 primeiros.
Neste exemplo, calculamos o total de vendas por ano e mês, agrupando os resultados de
acordo com o ano e o mês da data de compra.
Esta consulta usa uma variável para selecionar os produtos lançados no ano atual, permitindo
a atualização dinâmica do ano.
https://Linkedin.com/in/gabrielfinelli