O que é SQL

Na aula anterior você viu que um banco de dados é cuidado por um programa, o SGBD, como um depósito cuidado por um estoquista. Para pedir alguma coisa a esse estoquista, você precisa falar a língua dele. Essa língua é o SQL. Ela é pequena, parece inglês escrito devagar e, com meia dúzia de palavras, já responde perguntas de verdade sobre a Loja Aurora. Nesta aula você vai ler a sua primeira consulta parte por parte e entender o que o SQL sabe fazer.

Você vai aprender
  • O que quer dizer SQL e como se fala.
  • Por que o SQL é uma língua de pedidos: você diz o que quer, e o banco descobre como buscar.
  • A primeira consulta, parte por parte: SELECT, FROM, WHERE e o ponto e vírgula.
  • Os quatro tipos de comando: ler, mudar, criar e controlar.
  • As regras de escrita: maiúsculas, espaços, quebras de linha e aspas.
  • Que o SQL é um padrão, com pequenos "sotaques" em cada banco.
  • Os primeiros erros reais: palavra escrita errada, aspas duplas e a vírgula esquecida.

A ideia: pedir no balcão, não entrar na cozinha

Numa lanchonete, você chega ao balcão e diz: "um misto-quente e um suco de laranja sem açúcar". Você não explica à cozinheira onde fica o queijo, qual frigideira usar, nem em que ordem ligar o fogão. Você diz o que quer; ela sabe como fazer.

O SQL funciona assim. Você não escreve "abra a tabela de produtos, leia a primeira linha, veja se o preço é menor que 5, guarde, passe para a próxima…". Você escreve o pedido:

SELECT nome, preco
FROM produtos
WHERE preco < 5;

"Selecione o nome e o preço, dos produtos, onde o preço é menor que 5." O SGBD decide sozinho o melhor caminho para achar essas linhas, e o quadro mostra a resposta: três produtos da Loja Aurora custam menos de R$ 5,00. Línguas que funcionam assim se chamam declarativas (você declara o resultado que quer). A maioria das linguagens de programação, como Python ou C, é o contrário: nelas você dá o passo a passo.


1. O nome: Structured Query Language

SQL é a sigla de Structured Query Language, "linguagem estruturada de consulta". Uma consulta (query) é um pedido feito ao banco.

  • Como se fala: no Brasil, quase todo mundo diz as letras: "ésse-quê-éle". Em inglês você vai ouvir as duas formas, "es-kiu-el" e "síquel". As duas estão certas.
  • De onde veio: em 1970, o pesquisador Edgar F. Codd, da IBM, publicou a ideia do banco relacional, feito de tabelas. Logo depois, também na IBM, Donald Chamberlin e Raymond Boyce criaram uma língua para conversar com esses bancos, chamada primeiro de SEQUEL (daí a pronúncia "síquel") e depois de SQL.
  • Um padrão: o SQL virou norma oficial nos Estados Unidos (ANSI) em 1986 e no mundo (ISO) em 1987, e a norma ganha revisões até hoje. É por isso que o mesmo SELECT funciona no SQLite, no MySQL, no PostgreSQL e no SQL Server.

Mais de 50 anos depois, o SQL continua sendo a língua dos bancos de dados. Aprender SQL uma vez serve para a vida toda, em qualquer empresa.


2. A primeira consulta, parte por parte

Volte à consulta dos produtos baratos. Ela tem três partes e um ponto final:

SELECT nome, preco
FROM produtos
WHERE preco < 5;
SELECT nome, preco
SELECT quer dizer "selecione". Depois dele vêm as colunas que você quer ver, separadas por vírgula. O resultado vai ter exatamente essas duas colunas, nessa ordem.
FROM produtos
FROM quer dizer "de". Diz de qual tabela os dados vêm: a "gaveta" dos produtos.
WHERE preco < 5
WHERE quer dizer "onde". É o filtro: só entram as linhas em que o preço é menor (<) que 5. Sem o WHERE, viriam os 45 produtos. É opcional.
;
O ponto e vírgula termina o comando, como o ponto final de uma frase. No editor deste guia ele pode faltar no último comando; no terminal do SQLite, sem ele o comando não roda (você vai ver isso em O Terminal do SQLite).

As palavras em maiúsculas (SELECT, FROM, WHERE) são palavras-chave: fazem parte da língua SQL e têm sentido fixo. As em minúsculas (nome, preco, produtos) são nomes que quem criou o banco escolheu. Cada uma dessas palavras-chave tem aula própria: SELECT e WHERE.

Experimente: rode a consulta como está e veja os três produtos com preço menor que 5. Depois troque o 5 por 3 e rode de novo. Quantos produtos custam menos de R$ 3,00?

SELECT nome, preco
FROM produtos
WHERE preco < 5;
SELECT nome, preco
FROM produtos
WHERE preco < 3;

Brinque mais: troque o < por > ("maior que") e o número por 200 para achar o produto mais caro da loja. Cada vez que você clica em Rodar, o banco volta ao estado original: nada que você fizer aqui estraga a Loja Aurora.


3. O que dá para fazer com SQL

Perguntar é só uma parte. Com SQL você também muda os dados, cria tabelas novas e controla quem pode mexer em quê. Os comandos se dividem em quatro famílias:

FamíliaPara quêComandos principaisNa loja
Ler (consultas)Perguntar ao bancoSELECT"Quais produtos acabaram?"
Mudar os dadosPôr, alterar e tirar linhasINSERT, UPDATE, DELETECadastrar um cliente, mudar um preço, apagar um pedido cancelado
Criar a estruturaCriar, mudar e apagar tabelasCREATE, ALTER, DROPCriar a tabela de avisos da loja
ControlarAgrupar mudanças com segurança; dar permissõesBEGIN, COMMIT, ROLLBACK; GRANT, REVOKERegistrar uma venda inteira ou nada; deixar o estagiário só ler

Em livros e vagas de emprego, essas famílias aparecem com siglas em inglês: DQL (Data Query Language, ler), DML (Data Manipulation Language, mudar os dados), DDL (Data Definition Language, criar a estrutura), DCL e TCL (Data Control e Transaction Control Language, controlar). Não precisa decorar; só saiba que elas existem.

Veja uma de cada. Primeiro, mudar os dados: a loja abriu uma categoria nova, a de produtos para animais. O INSERT ("insira") põe uma linha nova, e o SELECT logo depois mostra a tabela já com ela:

INSERT INTO categorias (nome, descricao)
VALUES ('Pet', 'Ração e acessórios para animais');

SELECT * FROM categorias;

Repare nas duas respostas: o INSERT não devolve uma tabela, devolve "1 linha afetada", o recado de que deu certo. O SELECT mostra as 9 categorias, e a Pet ganhou o id 9 sozinha. Agora um UPDATE ("atualize"): a caneta azul subiu de preço.

UPDATE produtos
SET preco = 2.99
WHERE id = 2;

SELECT id, nome, preco FROM produtos WHERE id = 2;

E, por fim, criar a estrutura: uma tabela nova, que não existia no banco, para os avisos do mural da loja.

CREATE TABLE avisos (
  id    INTEGER PRIMARY KEY,
  texto TEXT
);

INSERT INTO avisos (texto) VALUES ('Promoção de volta às aulas');

SELECT * FROM avisos;

Três comandos, três respostas: "CREATE TABLE: ok", "1 linha afetada" e a tabela com o aviso. Cada um tem aula própria mais adiante: INSERT INTO, UPDATE, DELETE, CREATE TABLE e Transações. Por enquanto, o importante é saber que tudo isso é SQL.

No banco de verdade, mudar é para valer

No editor deste guia, cada Rodar começa do banco limpo, então o preço da caneta volta a 2.79 e a tabela de avisos some. Num banco de verdade, um UPDATE ou DELETE fica gravado. Um DELETE sem WHERE apaga a tabela inteira, sem perguntar "tem certeza?". Esse perigo tem uma aula só para ele: O Perigo do UPDATE e DELETE sem WHERE.


4. As regras de escrita

O SQL é tolerante com a forma e exigente com os nomes e as aspas. Quatro regras resolvem quase tudo:

  1. Maiúsculas e minúsculas nas palavras-chave tanto faz. SELECT, select e Select são a mesma palavra. O costume, que este guia segue, é escrever as palavras-chave em MAIÚSCULAS e os nomes em minúsculas: o olho separa logo o que é da língua e o que é do seu banco.
  2. Espaços e quebras de linha tanto faz. Pode escrever tudo numa linha ou uma parte por linha. Consultas grandes ficam muito mais fáceis de ler com uma parte por linha.
  3. O ponto e vírgula separa os comandos. Vários comandos na mesma caixa? Um ; no fim de cada um.
  4. Texto vai entre aspas simples: 'PI', 'Lápis Grafite HB'. Números vão sem aspas: 5, 2.99, com ponto como separador decimal, nunca vírgula.

Estas três consultas são a mesma pergunta, e dão a mesma resposta:

select nome, preco from produtos where preco < 5;
SELECT nome, preco FROM produtos WHERE preco < 5;
SELECT nome,
       preco
  FROM produtos
 WHERE preco < 5;
Jeito de escreverFunciona?Quando usar
Tudo em minúsculasSimTestes rápidos; mas fica difícil separar a língua dos nomes
Tudo numa linha, palavras-chave em MAIÚSCULASSimConsultas curtas, como as primeiras deste guia
Uma parte por linha, palavras-chave em MAIÚSCULASSimO padrão para qualquer consulta com mais de uma parte; é o jeito do guia

Agora o texto entre aspas simples. Quais clientes moram no Piauí?

SELECT nome, cidade
FROM clientes
WHERE estado = 'PI';

O 'PI' está entre aspas simples porque é um texto que você quer comparar. Sem as aspas, o banco acharia que PI é o nome de uma coluna. E com aspas duplas, também! Isso é tão comum que ganhou um caso em Quando dá errado.


5. Um padrão, vários sotaques

O português do Brasil e o de Portugal são a mesma língua, com algumas palavras diferentes ("ônibus" e "autocarro"). O SQL é igual: o SELECT … FROM … WHERE é o mesmo em todo banco, mas cada SGBD tem os seus "regionalismos" e as suas funções extras. Este guia ensina o SQL padrão usando o SQLite e avisa, numa caixa como esta, quando os outros bancos fazem diferente:

Nos outros bancos: "só os 5 primeiros"

Pedir só as primeiras linhas do resultado é o exemplo clássico de sotaque. No SQLite, e também no MySQL e no PostgreSQL, usa-se LIMIT no fim (aula LIMIT e OFFSET):

SELECT nome, preco FROM produtos LIMIT 5;

O SQL Server não tem LIMIT; usa TOP logo depois do SELECT. E a norma oficial (desde a revisão de 2008) tem uma terceira forma, FETCH FIRST, que o PostgreSQL também aceita. Os dois trechos abaixo são ilustrativos: o SQLite não os entende, por isso não têm o quadro de resultado.

SELECT TOP (5) nome, preco FROM produtos;
SELECT nome, preco FROM produtos FETCH FIRST 5 ROWS ONLY;

Fontes: documentação do TOP no SQL Server e do SELECT no PostgreSQL. As diferenças entre os bancos têm um grupo inteiro de aulas no Nível 3, a começar por As Diferenças entre os Bancos.


Quando dá errado

As mensagens do SQLite vêm em inglês. Abaixo, cada uma é a mensagem real que o seu navegador recebeu, com a tradução e o conserto.

Palavra-chave escrita errada
SELEC nome FROM produtos;

O que aconteceu: near "SELEC": syntax error quer dizer "perto de SELEC: erro de sintaxe". Sintaxe é a gramática da língua. O banco não conhece a palavra SELEC e avisa onde se perdeu: logo no começo.

Como consertar: SELECT, com T. Quando aparecer near "…": syntax error, olhe a palavra entre aspas e a que vem logo antes dela: o erro está ali.

Texto entre aspas duplas
SELECT nome, preco
FROM produtos
WHERE nome = "Lápis Grafite HB";

O que aconteceu: no such column: "Lápis Grafite HB" - should this be a string literal in single-quotes?, ou seja: "não existe a coluna "Lápis Grafite HB"; isto deveria ser um texto entre aspas simples?". No SQL padrão, aspas duplas servem para nomes (de tabela, de coluna), e aspas simples servem para texto. Com aspas duplas, o banco foi procurar uma coluna chamada Lápis Grafite HB. O próprio SQLite dá a dica do conserto.

Como consertar: aspas simples: WHERE nome = 'Lápis Grafite HB'.

Missão: a Ana quer o preço do lápis, mas a consulta dá erro. Rode, leia a mensagem e conserte as aspas.

SELECT nome, preco
FROM produtos
WHERE nome = "Lápis Grafite HB";
SELECT nome, preco
FROM produtos
WHERE nome = 'Lápis Grafite HB';
Texto sem aspas nenhuma
SELECT nome FROM clientes WHERE estado = PI;

O que aconteceu: no such column: PI. Sem aspas, PI é lido como um nome, e não há coluna com esse nome na tabela de clientes.

Como consertar: WHERE estado = 'PI'.

A vírgula esquecida (sem mensagem de erro!)
SELECT nome preco
FROM produtos
LIMIT 3;

O que aconteceu: o pior tipo de erro, o que não dá erro. A Ana queria duas colunas, nome e preço, mas esqueceu a vírgula. O SQL entendeu outra coisa: "mostre a coluna nome com o apelido preco". O resultado tem uma coluna só, com o título "preco" e os nomes dos produtos dentro. Apelidos são úteis e têm aula própria (Apelidos (AS)), mas aqui ele apareceu por engano.

Como consertar: SELECT nome, preco. Moral: além de ver se deu erro, olhe o resultado. As colunas são as que você pediu?

Partes fora de ordem
FROM produtos SELECT nome;

O que aconteceu: near "FROM": syntax error. Em português, "dos produtos, selecione o nome" ainda dá para entender; em SQL, não. As partes têm ordem fixa: SELECT, depois FROM, depois WHERE.

Como consertar: SELECT nome FROM produtos;.


Referência rápida

Palavra-chaveTraduçãoO que faz
SELECTselecioneEscolhe as colunas do resultado
FROMdeDiz de qual tabela os dados vêm
WHEREondeFiltra as linhas (opcional)
INSERT INTO … VALUESinsira em … os valoresPõe uma linha nova
UPDATE … SETatualize … definindoMuda valores de linhas que já existem
DELETE FROMapague deTira linhas
CREATE TABLEcrie a tabelaCria uma tabela nova
;ponto finalTermina um comando
'texto'aspas simplesUm valor de texto
"nome"aspas duplasUm nome de tabela ou coluna (nunca texto)
Mensagem do SQLiteQuer dizer
near "SELEC": syntax errorA gramática quebrou perto dessa palavra: palavra errada, parte fora de ordem, vírgula sobrando…
no such column: PINão existe essa coluna: nome errado, ou texto sem aspas
no such column: "…" - should this be a string literal in single-quotes?Texto entre aspas duplas; troque por simples
no such table: produtoNão existe essa tabela (veja O que é um Banco de Dados)

Exercícios

1. A palavra que seleciona

Complete a consulta que mostra o nome de todos os clientes:

nome FROM clientes;

2. De qual tabela?

Complete com a palavra-chave que diz de onde vêm os dados:

SELECT nome, cargo funcionarios;

3. Qual destas linhas compara um texto do jeito certo?

4. select nome from produtos; e SELECT nome FROM produtos;:

5. A Ana escreveu SELECT nome preco FROM produtos;. O que acontece?

6. Cadastrar um cliente novo é um comando de qual família?

Missão final: os clientes do Ceará

Missão: esta consulta mostra o nome e a cidade dos clientes do Piauí (a sigla do estado é PI). Mude-a para mostrar o nome e a cidade dos clientes do Ceará, cuja sigla é CE. Cuidado com as aspas. Quantos são, e de que cidade?

SELECT nome, cidade
FROM clientes
WHERE estado = 'PI';
SELECT nome, cidade
FROM clientes
WHERE estado = 'CE';

Resumo

  • SQL (Structured Query Language) é a língua para conversar com bancos de dados relacionais. Nasceu na IBM nos anos 1970 e é um padrão oficial desde 1986/1987.
  • É uma língua declarativa: você diz o que quer ("os produtos com preço menor que 5"), e o banco decide como buscar.
  • A consulta básica: SELECT colunas FROM tabela WHERE filtro ;.
  • Quatro famílias de comandos: ler (SELECT), mudar os dados (INSERT, UPDATE, DELETE), criar a estrutura (CREATE, ALTER, DROP) e controlar (BEGIN, COMMIT, GRANT…).
  • Palavras-chave em MAIÚSCULAS e nomes em minúsculas é costume, não regra. Espaços e quebras de linha são livres. Texto vai entre aspas simples; aspas duplas são para nomes.
  • Todo banco fala o mesmo SQL básico, com pequenos sotaques (LIMIT × TOP × FETCH FIRST).
  • Leia a mensagem de erro (syntax error, no such column) e também o resultado: uma vírgula esquecida não dá erro, mas muda a resposta.