Do you need SQL for a data related job?

Illustrations by Camila Henrique

I wanted to talk about this because I see a lot of doubts and lack of direction from people who are either beginning now in IT land or thinking about switching careers. The short answer to “do I need to know SQL for a data job?” , is yes. In the next few paragraphs I explain why I think so.

It’s easy to get caught up in all the fancy programming languages and methodologies for projects that sometimes the basics… are just not there. I believe having a good foundation opens paths to other doors that you could not see before. And I’m certain that SQL is one hell of a foundation to have in the data land.

Data jobs have been on a hype for the past few years. There’s a lot of speculating about what a data person job is (and actually it can vary a lot). However, there is one skill that seems to endlessly haunt job descriptions. Can you spot it below?

Taken from Linkedin, July 2021

Taken from Linkedin, July 2021

Taken from Linkedin, July 2021

SQL is always on high demand for any data job. Because it’s part of our basics. And knowing your basics can help you thrive. You can learn a lot of interesting stuff about data, but in the end, you’ll most likely need to get your hands on a database at some point, and SQL is how you talk to a database (and I think that’s beautiful. Stop judging me!).

I’m working on a series of posts dedicated to people who would like to learn SQL from zero. I’ll focus on the Microsoft product, MS SQL Server. They have a version of SQL just for it, it’s called T-SQL. I hope to share my knowledge with you and perhaps help someone along the way. This is my way of giving back to the community ūüôā

Any questions or suggestions, my comments are always there for you.

If you want to check out this same post in Portuguese, click here.

Voc√™ precisa de SQL para trabalhar na √°rea de dados?

Ilustra√ß√Ķes por Camila Henrique

Eu quis falar sobre isso pois eu vejo muitas d√ļvidas e uma falta de dire√ß√£o de pessoas que est√£o come√ßando em TI ou pensando em trocar de carreira. A resposta r√°pida para a pergunta ‚Äúeu preciso saber SQL para conseguir um trabalho na √°rea de dados?‚ÄĚ, √© sim, precisa. Nos pr√≥ximos par√°grafos eu te explico por que eu penso isso.

√Č f√°cil se perder no meio de tantas linguagens de programa√ß√£o e metodologias de projeto que √†s vezes o b√°sico fica pra tr√°s. Eu acredito que ter uma boa funda√ß√£o pode te abrir portas que antes voc√™ n√£o veria. Eu tenho certeza que SQL √© uma grande skill pra se ter na √°rea de dados.

Os data jobs est√£o em alta h√° alguns anos. Existe muita especula√ß√£o sobre o que uma pessoa da √°rea faz (e realmente, isso pode variar muito). Por√©m, existe uma habilidade que sempre aparece nas descri√ß√Ķes de vagas de trabalho. Voc√™ consegue encontr√°-la abaixo nos exemplos?

This image has an empty alt attribute; its file name is image.png
Linkedin, Julho 2021

Linkedin, Julho 2021

Linkedin, Julho 2021

O SQL sempre está em demanda para muitas vagas. Porque faz parte dos básicos da área. Quando você domina os básicos, você tem grandes chances de prosperar. Você pode aprender coisas ótimas sobre a área de dados, mas no fim, em algum momento você vai precisar lidar com ele: um banco de dados. E adivinha: SQL é justamente como nos comunicamos com os bancos de dados, sua própria língua (eu acho isso lindo, pare de me julgar!).

Eu estou trabalhando em uma s√©rie de posts dedicados √† pessoas que gostariam de aprender SQL do zero. Meu foco ser√° o produto da Microsoft, o MS SQL Server. Eles tem uma ‚Äúvers√£o” de SQL s√≥ para esse banco de dados, √© o T-SQL. Eu espero compartilhar meu conhecimento com voc√™ e quem sabe eu n√£o ajude algu√©m no meio do caminho. Esse √© meu jeito de retribuir para a comunidade ūüôā

Perguntas ou sugest√Ķes, meus coment√°rios est√£o sempre abertos!

Se você quiser ler este mesmo post em inglês, leia aqui.

T-SQL Tuesday – Meu tipo de dado (menos) favorito em SQL: DATE

Ol√°! Este post √© uma contribui√ß√£o ao T-SQL Tuesday. T-SQL Tuesday √© um blogothon mensal, onde a comunidade se re√ļne para escrever sobre um t√≥pico diferente. O t√≥pico de mar√ßo  √© sobre seu tipo de dados favorito. Brent Ozar √© o host do m√™s.

Eu escrevi esse post em duas vers√Ķes. Esta que voc√™ est√° lendo em portugu√™s, e uma em ingl√™s.

Se voc√™ trabalha com dados, voc√™ provavelmente n√£o tem controle sobre todas suas fontes. Por exemplo, voc√™ pode coletar dados de lugares diferentes. Talvez seja o seu trabalho centralizar os dados, e criar padr√Ķes para que os dados fa√ßam sentido para o seu time. Uma vez que voc√™ entendeu seus dados, voc√™ pode extrair o real valor deles.

Quando seus dados existem em diferentes sistemas, talvez voc√™ n√£o tenha controle sobre a valida√ß√£o que acontece por tr√°s. 

Por exemplo, um dos seus fornecedores podem ser muito espec√≠ficos sobre os tipos de dados que eles permitem no sistema. Isso significa que quando os dados chegarem at√© voc√™, voc√™ ver√° algo (idealmente) mais estruturado. Contudo, seus dados podem tamb√©m prover de um sistema liderado por desenvolvedores que decidiram deixar o usu√°rio ‚Äúlivre‚ÄĚ para fazer o que quiser (aten√ß√£o ao verbo ‚Äúquerer‚ÄĚ e n√£o ‚Äúprecisar‚ÄĚ, existe uma grande diferen√ßa a√≠).

Dados dos tipos de datas são muito importantes em SQL. Mas para nós humanos, datas podem ser formatadas de diferentes maneiras… Por exemplo, no Brasil, escrevemos datas de um jeito diferente dos Estados Unidos.

  • Brasil: DD/MM/AAAA
  • EUA: MM/DD/AAAA

Em SQL, seu tipo de data é guardado no banco assim: AAAA-MM-DD. Não tem como errar, certo? Errado.

Lembra quando eu disse que voc√™ pode ter origens diferentes dos dados e que por isso n√£o tem controle sobre as valida√ß√Ķes? Vamos pensar no seguinte exemplo:

  • Seus clientes usam um sistema de outro fornecedor, passando os dados para eles
  • O fornecedor usa os dados para fazer o que quer que seja que o sistema fa√ßa
  • Eles te enviam os dados com o resultado do projeto
  • Voc√™, um profissional inteligente, tenta carregar os dados no seu sistema. E mais importante, seu sistema √© formatado com os tipos de dados que voc√™ espera receber. Ent√£o, digamos que voc√™ queira receber um campo com valores do tipo data, voc√™ vai formatar sua tabela para ter um tipo de data.
  • Vamos usar a tabela ‚ÄúThirdPartyInfo‚ÄĚ abaixo como exemplo.

Agora, como você já deve ter imaginado, seu fornecedor não aplicou nenhum tipo de validação para esses tipos de dados. Logo, você pode se deparar com alguns tipos de datas estranhos, como esses:

  • Jan/2021
  • 03-20-18
  • 01-02-03 (onde come√ßar com esse?!)
  • 2022/2
  • Entre outros…

Isso é o que acontece quando tentamos inserir algo que não é uma data, em qualquer uma das colunas do tipo data.

Não importa o método que você use para popularizar essa tabela, você vai receber um erro se você não está passando valores do tipo data para suas colunas do tipo data.

Como evitar problemas como esse

  • Seja honesto com o seu fornecedor sobre a raz√£o de ter os tipos de dados que voc√™ precisa, e explique quais s√£o eles. Como explicar? Fazendo aquilo que os profissionais de TI mais odeiam: documentando.
  • Se o fornecedor est√° relutante com a mudan√ßa, fale com seus superiores, mostre para eles cen√°rios onde voc√™ tem que gastar seu tempo precioso (e caro) s√≥ para arrumar esse erro. Reinforce que isso pode ser evitado se todo mundo estivesse na mesma p√°gina sobre os tipos dos dados que voc√™s compartilham.
  • Se nada acima funcionar, ou voc√™ precisar de uma solu√ß√£o tempor√°ria enquanto a situa√ß√£o se resolve, voc√™ poderia validar os dados do seu lado. Se voc√™ fizer um esfor√ßo agora, antes do problema, pode parecer mais trabalho, massss o voc√™ do futuro vai te agradecer por ter se esfor√ßado antes do problema chegar.

Aprendendo do pior jeito

  • Exemplo da vida real: eu recentemente tive um problema que me custou um certo tempo. Eu recebi um arquivo csv necess√°rio para um relat√≥rio, e o arquivo tinha alguns campos de datas. Minha tabela estava esperando receber os campos de datas com valores‚Ķde datas. Por√©m, meu job do carregamento dos dados estava com problemas.
    • Eu tive que dar um passo para tr√°s e tentar encontrar a raiz do problema. Eu pensei que fosse ser algo f√°cil de conseguir se eu olhasse as entradas mais recentes do arquivo (esse tipo de arquivo era mandado pra n√≥s todos os dias, com as coisas mais recentes atualizadas). Meu problema principal, foi que eu n√£o isolei a coluna de data que estava dando erro. Na verdade, no SQL Server, a mensagem de erro quase sempre √© muito gen√©rica, e n√£o me falava qual a coluna. Tudo que eu sabia era que uma string estava tentando ser convertida em data, mas sem sucesso.
    • Meu segundo maior problema foi arrumar tudo que eu encontrei no arquivo, que pudesse de alguma forma estar causando o problema. Alerta spoiler: isso n√£o resolveu meu problema.
    • Eu demorei um tempo para entender que usar a fun√ß√£o ‚ÄúISDATE‚ÄĚ, seria uma maneira f√°cil de procurar por uma coluna que esperava receber um tipo de data, mas que recebia outra coisa.

Em momentos de desespero, esquecemos solu√ß√Ķes simples, como esta. 

Observe que o resultado dessa consulta tem um valor do tipo texto. Agora, você pode aplicar essa validação ANTES de carregar os dados na sua tabela de produção, além de usar o mesmo comando para investigar problemas como esse.

Resumindo: eu na verdade gosto do tipo DATE no SQL. Funciona bem, mas o problema real foi que falhamos como humanidade pois nunca concordamos em um √ļnico formato para datas. Espero te ajudar de alguma forma!

Se quiser ler mais sobre tipos de dados de datas em SQL, leia aqui (em ingl√™s). 

Você resolveria meu problema de uma maneira diferente? Me conte abaixo nos comentários (:

T-SQL Tuesday – My (least) favorite SQL data type: DATE

Hello! This post is a contribution to T-SQL Tuesday. T-SQL Tuesday is a monthly blogothon where we get together and write about a different topic. March’s topic was to blog about you favorite data type, hosted by Brent Ozar.

I wrote two versions of this post. This one you’re reading in English, and this one in Portuguese.

If you work with data, you probably do not have control over all the data sources you need. What I mean, is that for example, you may receive data from different places. Perhaps it’s your job to centralize and standardize it the best you can, so that it makes sense to your team. Once you understand the data, value can be extracted from it.

When your data comes from different systems, it’s likely you will not have control over the data’s validation. For example, one of you vendors may be very specific about the data types allowed into their systems, which means when the data gets to you, you’ll see something (ideally) more structured. However, your data may also be handled by a group of fed up developers who decided they will allow everything the user wants (special attention to the the verb there being want instead of need, big difference).

Date data types are really important and used in SQL. But for humans, dates can be formatted in some ways… For example, I’m from Brazil, and the way we write our dates is different from the US.

  • Brazil: DD/MM/YYYY
  • US: MM/DD/YYYY

In SQL, your date type stores data like this: YYYY-MM-DD. No room for mistakes, right? Bam, Wrong.

Remember when I said you may have different data sources and you can’t control their data type validations? Let’s think of the following example:

  • Your clients use a 3rd part system
  • The 3rd party uses the data to do whatever it is their system does
  • They send you that data with the results of your project
  • You, a smart data person, tries to load the data into your system. Most importantly, your system is formatted with the data types you expect to receive. So, for example, if you expect a field with a date value, you’ll format your table to have a date type column.
  • Let’s use the table “ThirdPartyInfo” as an example.

Now, as should have assumed by now, your third party did not applied any data validation to the date types. Hence, you may get some crazy “dates”, like this:

  • Jan/2021
  • 03-20-18
  • 01-02-03 (where to even begin with this one?!)
  • 2022/2
  • and many others….

Here’s what happens when you try to insert something that’s not a date, into any of the date columns:

It does not matter the method you’ll use to input data to your table, you’ll get an error if you’re not passing date values to your date types columns.

How can you avoid issues like this

  • Be open to your vendor about why this is important to your data, and explain to them your tables data type. How? Documenting, the thing IT people hate most.
  • If the vendor is pushing back, talk to your superiors, and show them a scenario in which you need to spend your precious (expensive) time to fix this mishap. Enforce this could be avoided if everyone were on the page about the data types for the data you share.
  • If nothing above works, or you need a temporary solution, you could validate the data on your end too. More work upfront, but your future self will thank you for putting this effort now.

Learning it the hard way

  • Real life example: I recently had an issue that cost me a lot of time. I had received a csv I needed for reporting, and the file had a few date fields. My table, was expecting date types to come in all the fields, but I was getting errors on my data loading job.
    • I had to take a step back and find where the issue was. I thought it would be easy to find, by checking the most recent info that got into the system (this was a daily file we received), and so I started looking for the issue. My main mistake, was that I did not isolate the date column that was giving me an error. In the SQL Server, the error message was really vague, I could only tell there was a string trying to be converted to date and I had several different date fields in my table.
    • My second big mistake was fixing everything I found on the source file, and I thought was wrong and causing the issues. Spoiler alert: it wasn’t.
    • It took me some time to realize that “ISDATE” was an easy way to search for a column that is expecting a date type, but received something else instead:
In desperate times, we may be blind by stress and not think about simple things, like this.

You see that the return to that query has the string value. Now, you could apply this kind of check as a validation before you load data into your production table, and also use it to troubleshoot issues like mine.

With all that being said, I actually like the DATE data type in SQL. It works great, the real issue is that we as humanity never agreed on a single date format. Sigh. I hope this helps!

If you want you can read more about the Date types here: Date types in SQL

Would you solve my problem in a different way? Tell me how below in the comments (:

Pr√°ticas para coment√°rios e nomes de arquivos SQL

Image: https://tinyurl.com/pt8ly0ix

Conhece o sentimento de abrir um novo arquivo, e pensar ‚Äúeu n√£o vou reutilizar esse c√≥digo‚Ķ s√≥ vou fazer isso uma vez‚Ķ‚ÄĚ. N√≥s dois sabemos que voc√™ est√° mentindo.

Eu estou falando isso pois, na maior parte do tempo:

  • seu c√≥digo √© reutiliz√°vel
  • voc√™ √© humano e esquece as coisas. Ent√£o, talvez amanh√£ voc√™ j√° tenha esquecido como resolver uma coisa que voc√™ fez hoje.
  • eu nunca vi onde voc√™ salva seus scripts mas eu aposto que voc√™ poderia fazer uma boa limpeza na sua pasta

Quando voc√™ est√° trabalhando em algo, tente se imaginar no futuro. O seu ‚Äúeu‚ÄĚ mais velho provavelmente n√£o tem ideia do que seja o *projeto_importante_2018_script*. O seu eu mais experiente est√° feliz lendo este arquivo? Eu acho que n√£o.

Se voc√™ fizer um esfor√ßo agora para ser mais ‚Äúarrumadinho‚ÄĚ com o seu c√≥digo, essas pessoas v√£o ficar muito felizes:

  • o seu eu futuro
  • seus colegas de trabalho que leem seus c√≥digos
  • pessoas que v√£o assumir seu lugar no futuro, e v√£o pensar ‚Äúolha s√≥! essa pessoa n√£o era t√£o p√©ssima, era apenas ruim mesmo!”

Como adicionar coment√°rios em SQL

Basicamente, existem duas maneiras de adicionar coment√°rios em SQL:

1- adicione ‚Äú–‚ÄĚ e comece a digitar!

2- adicione “/**/” e escreva entre os asteriscos.

Nenhum é melhor que o outro. A primeira opção é mais usada para comentários na mesma linha do código. A segunda, é mais comum para comentar blocos de código, ou escrever comentários maiores que não vão ficar em uma linha gigante.

Coment√°rios iniciais

Pessoalmente, eu acredito que comentários são algo bom. não é algo que eu faça em cada linha do código, porem, quando eu abro uma nova query, automaticamente eu adiciono um cabeçalho de comentários.

Eu começo meus scripts da seguinte forma:

Autor: quem est√° escrevendo o script.

Data: quando o script foi criado, para edi√ß√Ķes eu geralmente adiciono um edit na mesma linha.

Projeto: qual projeto o script faz parte. √Č legal descrever um pouco o projeto.

Descrição: descrever a razão do seu script, aqui é onde você explica onde está parte se encaixa no todo.

Requisitado por: nome de quem pediu que isso fosse desenvolvido. Além dos nomes, talvez seja interessante adicionar também os emails para contato.

Importante: se voc√™ est√° escrevendo uma stored procedure, lembre-se de adicionar o seu bloco de coment√°rios depois do comando ‚ÄúCREATE PROCEDURE‚ÄĚ. Fazendo isso, o seu coment√°rio vai estar integrado ao c√≥digo da proc, e vai aparecer inclusive quando voc√™ escolher a op√ß√£o de ‚Äúmodificar‚ÄĚ o arquivo. Se voc√™ n√£o fizer assim, o coment√°rio vai ficar salvo apenas no pr√≥prio arquivo principal do script.

Dando um nome ao arquivo

Tente ser descritivo e intuitivo quando for nomear seu arquivo, e não abrevie muito. O nome que você escolheu pode parecer relevante na hora, mas de novo, pergunte-se se o seu eu do futuro está te odiando agora.

Se o seu script fizer parte de um projeto maior, então tente começar o nome do arquivo como algo que remeta ao projeto.

Por exemplo: sp_RelatorioFinancasAutomatico_CalculoSalarioFuncionario

Com esse nome, sabemos:

  • sp: isso √© uma stored procedure
  • RelatorioFinancasAutomatico: nome descritivo do projeto
  • CalculoSalarioFuncionario: o que a sua parte especifica do script faz 

Evite usar termos como ‚Äúnovo‚ÄĚ, ‚Äúvelho‚ÄĚ, ‚Äúfinal‚ÄĚ, dentre outros. Isso n√£o √© √ļtil em longo prazo. Se voc√™ est√° criando v√°rios rascunhos, por exemplo, seria interessante versionar, usando ‚Äúv1‚ÄĚ, ‚Äúv2‚ÄĚ, ou at√© adicionar a data no nome do arquivo. Mas, lembre-se que esses nomes deveriam ser tempor√°rios, e assim que voc√™ descobrir qual finalmente √© sua vers√£o ‚Äúv23_final_novo‚ÄĚ, mude esse nome. Outra coisa que voc√™ pode fazer √© mover seus rascunhos para uma sub-pasta dentro do projeto, assim fica mais f√°cil de organizar os scripts ‚Äúfinais‚ÄĚ e importantes.

Essas s√£o coisas b√°sicas que eu fa√ßo todos os dias. Espero que voc√™ tenha achado √ļtil. Existe outra coisa que voc√™ adiciona que gostaria de compartilhar? Deixe seu coment√°rio (:

Quer ler este post em Inglês? Clique aqui.

Até mais!

Commenting and Naming practices with T-SQL scripts

Image: https://tinyurl.com/pt8ly0ix

Do you know that feeling when you’re starting another query and this time you’re thinking “I won’t re-use this… this is a one-time thing…”. We both know you’re lying.

I said that because most of the time:

  • you’re code is reusable
  • you’re human and you forget stuff, so perhaps tomorrow you forgot something you realized how to do today
  • I’ve never seen where you keep your scripts but I bet that needs a clean up

When you’re working on something, try to picture your future self. Your older self has probably no clue about what this *really_important_2018_script* project was. Is your older/wiser version happy while reading that? I don’t think so.

If you make an effort now to be more “tidy” with your code, here’s who will be happy:

  • your future self
  • your colleagues who read your code
  • people who will take your job in the future and think “hey! this person don’t suck as much as I thought… just a little!”

How to add comments in SQL

Basically, there are two ways to add comments in SQL:

1- add “–” and start typing!

2- add “/**/” and write in between the stars.

No one is better than the other. The first option is usually for in-line smaller comment. The second it’s more for commenting out blocks of code or writing bigger comments in a way they will not be on one same line.

Initial comments

Personally, I believe comments are a good thing. It’s not something I do with every line, however, when I open a new query, I automatically add my comments.

Here’s how I like to start my scripts:

Important note: if you’re writing a stored procedure, remember to add this block of comments after your “CREATE PROCEDURE” statement. When you do so, the comment will show up when you right-click on the stored procedure and chose “Modify”. Otherwise it’s gone and saved only on your main script file.

Naming your file

Try to be descriptive when naming your file, and don’t abbreviate too much. The name you chose may seem relevant now, but again, ask yourself “is my future version hating me now?”. If the answer is yes, than chose something else.

If the script you are creating is part of a bigger project that involves other scripts, then try to start every file name with something that refers to the project itself.

For example: sp_AutomatedFinancialReports_CalculatingEmployeeSalary

Here’s what we know based on the file name:

  • sp: this is a stored procedure
  • AutomatedFinancialReports: project name that’s descriptive
  • CalculatingEmployeeSalary: this is what your specific script will do as part of the project

Avoid at all costs using “new”, “old”, “final” and relative names on your file. This is not useful long-term. If you’re creating many drafts, I’d go with versions like “v1”, “v2”, or just add the plain date to your file name. But remember this is a temporary name, and that once you figure your “v23_final_new” file, you’ll change the name accordingly. Another trick is to move your thousand drafts to a, guess what, drafts folder. The idea is that your main project folder keeps your already tested and ready to go script.

This is some basic stuff I do everyday and I hope you find it useful. Do you add something else that you’d like to share? Leave a comment (:

Want to read this post in Portuguese? Check out this link.

See you later!