Select Star SQL
Português (Brasil)

O caso Beazley

Em 1994, Napoleon Beazley atirou no empresário John Luttig, de 63 anos, em sua garagem enquanto tentava roubar o carro da família. Como ele tinha pouco menos de 18 anos na época do assassinato, o caso Beazley provocou um intenso debate sobre a pena de morte para infratores juvenis. Três anos após a execução de Beazley, a Suprema Corte proibiu a execução de infratores que tivessem menos de 18 anos na época do crime (Roper v Simmons, 2005).

O caso também foi notável porque a vítima era pai do juiz federal John Michael Luttig. Durante os recursos apresentados à Suprema Corte, três dos nove ministros se declararam impedidos devido aos seus vínculos pessoais com o juiz Luttig, deixando apenas seis para analisar o caso.

Napoleon Beazley fez uma declaração final emocionada, argumentando que olho por olho não constitui justiça. Nossa tarefa é recuperar sua declaração do banco de dados.


Uma primeira consulta SQL

Da esquerda para a direita, as colunas são:

A consulta SQL pode parecer uma frase comum, mas você deve enxergá-la como três blocos de Lego: SELECT * FROM executions LIMIT 3. Assim como no Lego, cada bloco tem um formato fixo e os diferentes blocos precisam se encaixar de determinadas maneiras.


O bloco SELECT

O bloco SELECT especifica quais colunas você deseja exibir. Seu formato é SELECT <column>, <column>, .... Cada coluna deve ser separada por uma vírgula, mas o espaço após a vírgula é opcional. O asterisco (isto é, *) é um caractere especial que significa que queremos todas as colunas da tabela.

Comentários em SQL

Observe que, ao clicar em "Show Solution", a solução é exibida no editor precedida por /*. O conteúdo entre /* e */ é tratado como comentário e não é executado como código. Isso é útil para ocultar temporariamente um código que não queremos executar. Para executar a solução, basta apagar ou comentar seu código e remover o comentário da solução.

-- é outra forma de indicar comentários. Ele marca o restante de uma única linha como comentário. Quando queremos comentar várias linhas, /* ... */ é mais conveniente do que adicionar -- no início de cada uma delas.


O bloco FROM

O bloco FROM especifica em qual tabela estamos fazendo a consulta. Seu formato é FROM <table>. Ele sempre vem depois do bloco SELECT.

No próximo exemplo, observe que não precisamos do bloco FROM se não estivermos usando nada de uma tabela.

Não é estranho que 51 / 2 resulte em 25 em vez de 25.5? Isso acontece porque o SQL está fazendo uma divisão inteira. Para fazer uma divisão decimal, pelo menos um dos operandos deve ser decimal, por exemplo, 51.0 / 2. Um truque comum é multiplicar um dos números por 1.0 para convertê-lo em decimal. Isso será útil nos capítulos seguintes.

Uso de maiúsculas e minúsculas

Embora tenhamos escrito SELECT, FROM e LIMIT em letras maiúsculas, os comandos SQL não diferenciam maiúsculas de minúsculas. Você pode ver que o editor de código os reconhece e os formata como comandos independentemente de como são escritos. Ainda assim, recomendo escrevê-los em letras maiúsculas para diferenciá-los dos nomes de colunas, tabelas e variáveis.

Os nomes de colunas, tabelas e variáveis também não diferenciam maiúsculas de minúsculas nesta versão do SQL, embora diferenciem em muitas outras versões. Para garantir segurança, recomendo sempre presumir que diferenciam.

Espaços em branco

Espaços em branco são espaços, tabulações, quebras de linha e outros caracteres que aparecem como espaço vazio na página. Assim como acontece com maiúsculas e minúsculas, o SQL não é muito sensível a espaços em branco, desde que você não junte duas palavras em uma só. Isso significa que basta haver pelo menos um caractere de espaço em branco ao redor de cada comando — não importa qual seja ou quantos você use. A menos que seja uma consulta curta, prefiro colocar cada comando em uma nova linha para melhorar a legibilidade.


O bloco WHERE

O bloco WHERE permite filtrar a tabela pelas linhas que atendem a determinadas condições. Seu formato é WHERE <clause> e ele sempre vem depois do bloco FROM. Aqui, uma cláusula é uma expressão booleana que o computador pode avaliar como verdadeira ou falsa, como ex_number = 145. Você pode imaginar que o computador percorrerá cada linha da tabela, verificando se a cláusula é verdadeira e, se for, retornará a linha.

É fácil ver como podemos usar operadores aritméticos como < e <= para construir cláusulas. Também existem vários operadores de strings para trabalhar com textos.

O mais poderoso deles provavelmente é o LIKE. Ele permite usar curingas como % e _ para corresponder a diferentes caracteres. Por exemplo, first_name LIKE '%roy' retornará verdadeiro para linhas cujos primeiros nomes sejam ‘roy’, ‘Troy’ e ‘Deroy’, mas não ‘royman’. O curinga _ corresponde a um único caractere, então first_name LIKE '_roy' corresponderá apenas a ‘Troy’.

Aspas

Em SQL, strings são delimitadas por aspas simples. Crases (isto é, `) podem ser usadas para delimitar nomes de colunas e tabelas. Isso é útil quando o nome da coluna ou tabela é igual a uma palavra-chave do SQL ou contém espaços. É possível ter um banco de dados com uma tabela chamada 'where' e uma coluna chamada 'from'. (Quem seria tão cruel a ponto de fazer isso?!) Nesse caso, você teria que usar SELECT `from` FROM `where` WHERE .... Este é outro exemplo de por que escrever os comandos SQL em letras maiúsculas ajuda.

Como você viu no exercício anterior, cláusulas complexas podem ser construídas a partir de cláusulas simples usando operadores booleanos como NOT, AND e OR. O SQL dá maior precedência a NOT, depois a AND e, por fim, a OR. Mas se, como eu, você for preguiçoso demais para lembrar a ordem de precedência, pode usar parênteses para deixar clara a ordem desejada.

Vamos fazer um teste rápido para consolidar seu entendimento.

Agora você tem as ferramentas necessárias para concluir nosso projeto.

Não é incrível como Beazley é profundo e eloquente? Lembre-se de que ele tinha apenas 25 anos quando fez a declaração e estava preso desde os 18.


Recapitulação

O objetivo deste capítulo foi apresentar a estrutura básica, mas poderosa, SELECT <column> FROM <table> WHERE <clause>. Ela nos permite filtrar uma tabela fazendo com que o computador percorra as linhas uma a uma e selecione aquelas para as quais a cláusula WHERE é verdadeira. Também aprendemos a construir cláusulas razoavelmente complexas que podem operar sobre colunas com valores de texto, numéricos e booleanos.

Até agora, trabalhamos no nível das linhas, o que nos limitou à análise de pontos de dados individuais. No próximo capítulo, vamos nos concentrar em agregações, que nos permitirão estudar fenômenos do sistema como um todo.