Aviso: Muitas vezes detalhes de vÔrias operações podem variar de banco para banco. Em questões onde fiquei em dúvida, este documento segue o funcionamento do PostgreSQL, pois é o banco que conheço melhor.
Antes de começar a escrever SQL, você precisa entender o modelo de como um banco de dados relacional funciona. Não precisa se aprofundar muito, mas você precisa entender como que dados e relacionamentos entre eles são representados. (Nota importante: Relacionamento e relação não são a mesma coisa!)
Coisas que vocĆŖ precisa saber responder:
- O que é uma relação?
- Como dados são representados em uma relação?
- Como podemos expressar relacionamentos entre relaƧƵes distintas?
Você vai ver um monte de operações matemÔticas complexas estudando isso. Não se preocupe demais, a este ponto você só precisa entender a lógica geral.
O ideal é começar com um banco de dados jÔ predefinido e aprender a buscar dados de vÔrias formas nele. Você pode usar bancos jÔ prontos para aprendizado como o https://mystery.knightlab.com/ ou pegar datasets como os que tem aqui: https://learnsql.com/blog/free-online-datasets-to-practice-sql/
O que vocĆŖ precisa aprender nessa fase:
- Filtrar as linhas de uma tabela usando
WHERE - Remover linhas duplicadas usando
DISTINCT - Combinar condiƧƵes usando
AND,OReNOT - Ordenar os resultados usando
ORDER BY - Limitar a quantidade de resultados usando
LIMITouTOP - Filtrar strings usando
LIKE
O que vocĆŖ precisa aprender nessa fase:
- Atualizar dados no banco usando
UPDATE - Apagar dados do banco usando
DELETE
O que vocĆŖ precisa aprender nessa fase:
- Selecionar dados agregados usando
COUNT(),AVG(),SUM(),MIN()eMAX() - Agrupar linhas usando
GROUP BYe colcular agregaƧƵes sobre cada grupo
Agora que você aprendeu a buscar e atualizar dados, é a hora de começar a modelar seus próprios dados. Tem vÔrios exemplos clÔssicos, mas o ideal é você tentar modelar algo que seja interessante pra você ou tentar fazer algo baseado nos datasets de exemplo que mandei acima.
O que vocĆŖ precisa aprender nessa fase:
- Aprender como pegar dados estruturados e convertê-los em um modelo relacional normalizado. Você pode usar recursos como o Guia de normalização do TowardsDataScience
- Aprender sobre chaves primƔrias e chaves estrangeiras
- Praticar a modelagem criando schemas SQL usando
CREATE TABLE - Aprender a inserir dados usando
INSERT - Aprender a gerenciar as tabelas do seu banco usando
ALTER TABLEeDROP TABLE
Em geral, você quer impor restrições sobre os dados que entram no banco. Em geral é melhor impedir dados invÔlidos de entrarem no banco com constraints e não deixar o controle disso só na aplicação que acessa o banco.
O que vocĆŖ precisa aprender nessa fase:
- Impedir valores duplicados em tabelas com o constraint
UNIQUE - Impedir valores nulos em colunas com o constraint
NOT NULL - Aplicar condiƧƵes arbitrƔrias sobre dados com o constraint
CHECK
Até agora você estava selecionando dados de uma tabela só, mas no mundo real muitas vezes precisamos encontrar dados de vÔrias tabelas. Por exemplo, em um sistema de venda de passagens, encontrar as passagens compradas por um determinado usuÔrio.
O que vocĆŖ precisa aprender nessa fase:
- Juntar os dados em comum de tabelas usando
INNER JOIN - Selecionar os dados de uma tabela que estão presentes em outra usando
LEFT JOINeRIGHT JOIN - Combinar tabelas usando
FULL OUTER JOIN - Selecionar dados hierƔrquicos e fazer comparaƧƵes usando self-joins
Com JOIN, suas queries vão começar a ficar bastante complexas. Para organizÔ-las, você pode separÔ-las em fragmentos reutilizÔveis utilizando Common Table Expressions.
O que vocĆŖ precisa aprender nessa fase:
- Usar os resultados de uma query em outra com subqueries
- Compor queries complexas a partir de fragmentos simples usando
WITH - Aprenda a diferenƧa entre CTEs e subqueries e por que em geral Ʃ melhor usar CTEs
Você jÔ sabe a maior parte das features necessÔrias para compor queries complexas. Agora iremos estudar algumas operações mais exóticas e como manter a integridade de dados do seu banco quando ele é consultado por uma aplicação.
O que vocĆŖ precisa aprender nessa fase:
- Juntar os resultados de vƔrias queries usando
UNION,INTERSECTIONeEXCEPT - Criar condicionais usando
CASE - Tratar valores nulos usando
COALESCEeNULLIF - Fazer comparaƧƵes com listas de valores usando
ANY,ALLeEXISTS
O que vocĆŖ precisa aprender nessa fase:
- O que Ć© cada uma das propriedades da sigla ACID
- Como os bancos SQL garantem as propriedades ACID
Ćndices servem para acelerar queries sobre campos especĆficos. VocĆŖ pode usar Ćndices para acelerar a execução de queries frequentes. Recomendo ler os primeiros capĆtulos do Use the Index, Luke!.
Muitas vezes vocĆŖ precisa fazer vĆ”rias queries de escrita e possivelmente de leitura no banco de forma tal que, se uma delas falha, o banco deve ficar no estado inicial. Isso Ć© possĆvel em SQL usando transaƧƵes - blocos de queries associadas entre si.
Este é um tópico que varia bastante entre implementações de bancos de dados.
O que vocĆŖ precisa aprender nessa fase:
- Criar, confirmar e cancelar transaƧƵes usando
BEGIN,COMMITeROLLBACK - Aprender sobre os nĆveis de isolamento de transaƧƵes
- Estudar quais garantias o seu banco dĆ” em cada nĆvel de isolamento disponĆvel nele
- Aprender a usar transaƧƵes junto com constraints para garantir seguranƧa de forma eficiente
- Praticar bastante usar transações, especialmente em situações de vÔrios acessos simultâneos
Ć relativamente comum precisar ler um dado na aplicação, fazer alguma operação com ele e escrever de volta no banco de dados. Isso pode causar problemas se o valor desse dado for alterado entre a leitura e a escrita. Para impedir isso, Ć© possĆvel trancar partes do banco de dados para que ele nĆ£o possa ser modificado atĆ© que alguma condição seja satisfeita.
Este é um tópico que varia bastante entre implementações de bancos de dados.
O que vocĆŖ precisa aprender nessa fase:
- Antes de estudar locking, aprenda a evitar locking com
UPDATEs bem planejados! Locking sempre tem um custo de performance e deve ser evitado sempre que possĆvel. - Trancar dados que serĆ£o escritos posteriormente usando
SELECT FOR UPDATEouUPDLOCK. - Aprenda quais sĆ£o os nĆveis de locking que seu banco oferece e as diferenƧas entre eles.
- Aprenda a fazer "locking otimista" usando um campo de versionamento na tabela.
Em geral servidores SQL oferecem vÔrias funções para manipular dados mais complexos como datas, números, tipos compostos, etc.
Este é um tópico que varia bastante entre implementações de bancos de dados.
O que vocĆŖ precisa aprender nessa fase:
- Aprenda quais sĆ£o os tipos de dados do seu banco. VocĆŖ provavelmente aprendeu o bĆ”sico modelando tabelas, mas vocĆŖ sabia que, por exemplo, o Postgres tem uma sĆ©rie de tipos especĆficos pra fazer queries sobre dados geomĆ©tricos, como por ex determinar se um conjunto de coordenadas estĆ” dentro de uma determinada Ć”rea?
- Aprenda a converter entre tipos de dados com
CAST - Para cada um dos tipos, pesquise as funƧƵes que seu banco oferece para tratƔ-lo.
- Em especial, aprenda os operadores de datas! Ć extremamente comum precisar fazer coisas como computar uma data a partir de dia, mĆŖs e ano, ou somar um intervalo a uma data, ou determinar se uma data estĆ” entre duas outras.
Uma query lenta pode ser o gargalo da sua aplicação inteira. Para otimizar queries, precisamos entender por que elas ficam lentas, e para isso precisamos saber o que o banco estÔ fazendo.
O que vocĆŖ precisa aprender nesta fase:
- Gerar planos de execução e estatĆsticas de execução com
EXPLAINeEXPLAIN ANALYZE - Aprender a ler os planos de execução e identificar gargalos usando eles
- Aprender a resolver os gargalos encontrados refatorando queries e adicionando Ćndices onde necessĆ”rio
- Recomendo terminar de ler o Use the Index, Luke!
Funções de janela servem para fazer um cÔlculo sobre vÔrias linhas escolhidas a partir de uma linha inicial. Por exemplo: Para cada funcionÔrio de uma empresa, você pode querer saber se o salÔrio dele é maior que o salÔrio médio dos funcionÔrios do mesmo departamento. Com uma função de janela, isso pode ser feito em uma única query.
O que vocĆŖ precisa aprender nesta fase:
- Quais são as funções de janela suportadas pelo seu banco
- Criar anƔlises complexas usando funƧƵes de janela
Ć possĆvel criar suas próprias funƧƵes ou triggers (operaƧƵes que sĆ£o disparadas quando ocorre algum evento especĆfico) usando a extensĆ£o PL/SQL, uma linguagem procedural executada pelo próprio banco. Vale a pena aprender um pouco de PL/SQL para implementar funcionalidades avanƧadas.
O que vocĆŖ precisa aprender nessa fase:
- Escrever funƧƵes que manipulam o banco usando PL/SQL
- Criar triggers para que o banco se atualize sozinho em resposta a certos eventos
Para configurar o banco de dados, você provavelmente precisou criar um usuÔrio e dar certas permissões a ele. Se você trabalha com DB numa empresa, provavelmente os usuÔrios necessÔrios foram criados para você. Mas agora é a hora de aprender a gerenciar usuÔrios, permissões, bancos de dados (um único servidor pode gerir vÔrios bancos) e configurações do banco.
Este tópico é diferente para cada banco. Consulte a documentação do seu banco para estudar este tópico.
Todos os bancos SQL implementam extensões. Por exemplo, vÔrios bancos permitem que você defina funções em linguagens de programação diferentes de PL/SQL. Consulte a documentação do seu banco e aprenda como as extensões dele funcionam.
Consulte a documentação do seu banco e estude como ele implementa features do SQL que jĆ” estudamos como transaƧƵes, Ćndices, ACID e assim por diante. Isso terĆ” implicaƧƵes importantes para otimização avanĆ”cada de performance.
great.