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.
- 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,WHEREe 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
SELECTfunciona 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
SELECTquer 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
FROMquer dizer "de". Diz de qual tabela os dados vêm: a "gaveta" dos produtos.- WHERE preco < 5
WHEREquer dizer "onde". É o filtro: só entram as linhas em que o preço é menor (<) que 5. Sem oWHERE, 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ília | Para quê | Comandos principais | Na loja |
|---|---|---|---|
| Ler (consultas) | Perguntar ao banco | SELECT | "Quais produtos acabaram?" |
| Mudar os dados | Pôr, alterar e tirar linhas | INSERT, UPDATE, DELETE | Cadastrar um cliente, mudar um preço, apagar um pedido cancelado |
| Criar a estrutura | Criar, mudar e apagar tabelas | CREATE, ALTER, DROP | Criar a tabela de avisos da loja |
| Controlar | Agrupar mudanças com segurança; dar permissões | BEGIN, COMMIT, ROLLBACK; GRANT, REVOKE | Registrar 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 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:
- Maiúsculas e minúsculas nas palavras-chave tanto faz.
SELECT,selecteSelectsã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. - 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.
- O ponto e vírgula separa os comandos. Vários comandos na mesma caixa? Um
;no fim de cada um. - 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 escrever | Funciona? | Quando usar |
|---|---|---|
| Tudo em minúsculas | Sim | Testes rápidos; mas fica difícil separar a língua dos nomes |
| Tudo numa linha, palavras-chave em MAIÚSCULAS | Sim | Consultas curtas, como as primeiras deste guia |
| Uma parte por linha, palavras-chave em MAIÚSCULAS | Sim | O 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:
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.
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.
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';
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'.
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?
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-chave | Tradução | O que faz |
|---|---|---|
SELECT | selecione | Escolhe as colunas do resultado |
FROM | de | Diz de qual tabela os dados vêm |
WHERE | onde | Filtra as linhas (opcional) |
INSERT INTO … VALUES | insira em … os valores | Põe uma linha nova |
UPDATE … SET | atualize … definindo | Muda valores de linhas que já existem |
DELETE FROM | apague de | Tira linhas |
CREATE TABLE | crie a tabela | Cria uma tabela nova |
; | ponto final | Termina um comando |
'texto' | aspas simples | Um valor de texto |
"nome" | aspas duplas | Um nome de tabela ou coluna (nunca texto) |
| Mensagem do SQLite | Quer dizer |
|---|---|
near "SELEC": syntax error | A gramática quebrou perto dessa palavra: palavra errada, parte fora de ordem, vírgula sobrando… |
no such column: PI | Nã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: produto | Nã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:
2. De qual tabela?
Complete com a palavra-chave que diz de onde vêm os dados:
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:
SELECTcolunasFROMtabelaWHEREfiltro;. - 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.