SQL Palavras-chave

As palavras-chave são as palavras que o próprio SQL entende: SELECT, FROM, WHERE, INSERT… Esta página reúne as que aparecem no guia, separadas por assunto, cada uma com o que faz, um exemplo curto e o link para a aula onde ela é explicada com calma. Use-a como um dicionário: quando encontrar uma palavra que não lembra, procure aqui.

Como ler esta página
  • Todo exemplo roda no SQLite 3.50.4 do guia, com o banco da Loja Aurora. Copie para o editor de qualquer aula e clique em Rodar; cada Rodar parte do banco limpo, então os exemplos de INSERT, UPDATE e DELETE não estragam nada.
  • As palavras-chave não ligam para maiúsculas: SELECT e select são a mesma coisa. O costume, seguido no guia, é escrevê-las em MAIÚSCULAS (aula SELECT).
  • Algumas palavras só funcionam juntas, como ORDER BY ou IS NOT NULL; elas aparecem juntas na tabela.

Atalhos: Consultar · Filtrar e comparar · Juntar tabelas · Combinar consultas · Subconsultas e CASE · Janelas · Mudar dados · Criar tabelas · Regras das colunas · Transações · Ferramentas do SQLite · A ordem das cláusulas


Consultar

PalavraO que fazExemploAula
SELECT"Selecione": pede dados e diz quais colunas mostrarSELECT nome FROM categorias;SELECT
FROM"De": a tabela de onde os dados vêmSELECT * FROM clientes;SELECT
DISTINCTTira as linhas repetidas do resultadoSELECT DISTINCT cidade FROM clientes;SELECT DISTINCT
ALLMantém as repetições (o normal, quase nunca escrito)SELECT ALL cidade FROM clientes;SELECT DISTINCT
ASDá um apelido a uma coluna ou tabelaSELECT nome AS produto FROM produtos;Apelidos (AS)
WHERE"Onde": filtra as linhasSELECT nome FROM clientes WHERE estado = 'PI';WHERE
ORDER BYOrdena as linhas do resultadoSELECT nome, preco FROM produtos ORDER BY preco;ORDER BY
ASC / DESCOrdem crescente (o normal) / decrescenteSELECT nome, preco FROM produtos ORDER BY preco DESC;ORDER BY
NULLS FIRST / NULLS LASTPõe os NULL no começo ou no fim da ordenaçãoSELECT nome, email FROM clientes ORDER BY email NULLS LAST;ORDER BY
LIMITMostra no máximo N linhasSELECT nome FROM produtos LIMIT 5;LIMIT e OFFSET
OFFSETPula as primeiras N linhas (usado com LIMIT)SELECT nome FROM produtos LIMIT 5 OFFSET 10;LIMIT e OFFSET
GROUP BYJunta as linhas em grupos, um por valorSELECT estado, count(*) FROM clientes GROUP BY estado;GROUP BY
HAVINGFiltra os grupos (o WHERE filtra linhas)SELECT estado, count(*) FROM clientes GROUP BY estado HAVING count(*) > 5;HAVING
FILTERSó as linhas que passam na condição entram numa função agregadaSELECT count(*) FILTER (WHERE vip = 1) FROM clientes;Funções Agregadas

Filtrar e comparar

PalavraO que fazExemploAula
AND"E": todas as condições precisam ser verdadeirasSELECT nome FROM clientes WHERE estado = 'PI' AND vip = 1;AND
OR"Ou": basta uma condição ser verdadeiraSELECT nome FROM clientes WHERE estado = 'PE' OR estado = 'CE';OR
NOTInverte uma condiçãoSELECT nome FROM clientes WHERE NOT vip = 1;NOT
INO valor está numa listaSELECT nome FROM clientes WHERE estado IN ('PE', 'CE');IN
BETWEEN … ANDO valor está numa faixa (as duas pontas incluídas)SELECT nome FROM produtos WHERE preco BETWEEN 20 AND 30;BETWEEN
LIKECompara com um padrão de textoSELECT nome FROM clientes WHERE nome LIKE 'Ana %';LIKE
ESCAPEEscolhe o caractere que faz % e _ valerem como texto num LIKESELECT nome FROM produtos WHERE nome LIKE '%!%%' ESCAPE '!';Curingas (% e _)
GLOBPadrão de texto no estilo dos arquivos (*, ?), que liga para maiúsculas; só no SQLiteSELECT nome FROM produtos WHERE nome GLOB 'C*';Curingas (% e _)
NULL"Sem valor"SELECT NULL;O Valor NULL
IS NULLO campo está vazioSELECT nome FROM clientes WHERE email IS NULL;IS NULL e IS NOT NULL
IS NOT NULLO campo tem valorSELECT nome FROM clientes WHERE email IS NOT NULL;IS NULL e IS NOT NULL
TRUE / FALSEVerdadeiro e falso; no SQLite, outros nomes para 1 e 0SELECT nome FROM clientes WHERE vip = TRUE;Tipos de Dados
COLLATEEscolhe a regra de comparação de textos; NOCASE ignora maiúsculas (só nas letras sem acento)SELECT nome FROM clientes WHERE cidade = 'teresina' COLLATE NOCASE;Funções de Texto
CAST … ASConverte um valor para outro tipoSELECT CAST('42' AS INTEGER);Os Tipos no SQLite

Juntar tabelas

PalavraO que fazExemploAula
JOIN / INNER JOINJunta as linhas das duas tabelas que combinamSELECT p.nome, c.nome FROM produtos AS p JOIN categorias AS c ON c.id = p.categoria_id;INNER JOIN
ONA condição que liga as duas tabelas(no exemplo acima: ON c.id = p.categoria_id)O que é um JOIN
USINGLiga pelas colunas que têm o mesmo nome nas duas tabelasSELECT c.nome, f.nome FROM clientes AS c JOIN fornecedores AS f USING (cidade);INNER JOIN
LEFT JOINTodas as linhas da tabela da esquerda, com ou sem parSELECT c.nome, p.id FROM clientes AS c LEFT JOIN pedidos AS p ON p.cliente_id = c.id;LEFT JOIN
RIGHT JOINTodas as linhas da tabela da direita, com ou sem parSELECT c.nome, p.id FROM pedidos AS p RIGHT JOIN clientes AS c ON p.cliente_id = c.id;RIGHT JOIN
FULL JOINTodas as linhas das duas tabelas, com ou sem parSELECT c.nome, p.id FROM clientes AS c FULL JOIN pedidos AS p ON p.cliente_id = c.id;FULL JOIN
CROSS JOINTodas as combinações possíveis (cada linha com cada linha)SELECT c.nome, f.nome FROM categorias AS c CROSS JOIN fornecedores AS f;O que é um JOIN

Combinar consultas

PalavraO que fazExemploAula
UNIONJunta os resultados de duas consultas, sem repetiçõesSELECT cidade FROM clientes UNION SELECT cidade FROM fornecedores;UNION
UNION ALLJunta os resultados, com repetiçõesSELECT cidade FROM clientes UNION ALL SELECT cidade FROM fornecedores;UNION ALL
INTERSECTSó o que aparece nas duas consultasSELECT cidade FROM clientes INTERSECT SELECT cidade FROM fornecedores;UNION
EXCEPTO que aparece na primeira e não na segundaSELECT cidade FROM clientes EXCEPT SELECT cidade FROM fornecedores;UNION

Subconsultas, CTE e CASE

PalavraO que fazExemploAula
EXISTSVerdadeiro se a subconsulta devolve pelo menos uma linhaSELECT nome FROM clientes AS c WHERE EXISTS (SELECT 1 FROM pedidos AS p WHERE p.cliente_id = c.id);EXISTS
ANY / SOME / ALLCompara um valor com uma lista vinda de uma subconsulta. Não existem no SQLite (dão syntax error); a aula mostra o equivalente—ANY e ALL
CASE WHEN … THEN … ELSE … ENDEscolhe um valor conforme condições, como um "se… então… senão"SELECT nome, CASE WHEN preco > 100 THEN 'caro' ELSE 'barato' END FROM produtos;CASE
WITHDá nome a uma consulta para usar logo em seguida (CTE)WITH caros AS (SELECT * FROM produtos WHERE preco > 100) SELECT nome FROM caros;CTE (WITH)
RECURSIVEUma CTE que usa a si mesma, para repetir um passoWITH RECURSIVE n(x) AS (SELECT 1 UNION ALL SELECT x + 1 FROM n WHERE x < 5) SELECT x FROM n;CTE Recursiva

Funções de janela

PalavraO que fazExemploAula
OVERCalcula uma função olhando um conjunto de linhas, sem juntá-las numa sóSELECT nome, preco, rank() OVER (ORDER BY preco DESC) FROM produtos;Funções de Janela (OVER)
PARTITION BYDivide as linhas da janela em gruposSELECT nome, categoria_id, rank() OVER (PARTITION BY categoria_id ORDER BY preco DESC) FROM produtos;PARTITION BY

Mudar dados

PalavraO que fazExemploAula
INSERT INTOAcrescenta linhas a uma tabelaINSERT INTO categorias (nome, descricao) VALUES ('Pet', 'Artigos para animais');INSERT INTO
VALUESOs valores da linha nova (vários grupos = várias linhas)(no exemplo acima)Inserindo Várias Linhas
UPDATE … SETMuda valores de linhas que já existemUPDATE produtos SET estoque = 50 WHERE id = 12;UPDATE
DELETE FROMApaga linhasDELETE FROM itens_pedido WHERE pedido_id = 90;DELETE
RETURNINGMostra as linhas que o comando inseriu, mudou ou apagouDELETE FROM itens_pedido WHERE pedido_id = 90 RETURNING produto_id;DELETE
INSERT INTO … SELECTInsere o resultado de uma consultaINSERT INTO categorias (nome) SELECT 'Cópia de ' || nome FROM categorias WHERE id = 1;INSERT INTO SELECT
ON CONFLICT … DODiz o que fazer quando o INSERT bate numa chave repetida ("upsert")INSERT INTO categorias (id, nome, descricao) VALUES (1, 'Papelaria', 'Novo texto') ON CONFLICT (id) DO UPDATE SET descricao = excluded.descricao;Erros Comuns
REPLACE INTOInsere; se a chave já existe, apaga a linha antiga e põe a nova (extensão fora do padrão; existe no SQLite e no MySQL)REPLACE INTO categorias (id, nome, descricao) VALUES (8, 'Jardim', 'Plantas');INSERT INTO
UPDATE e DELETE sem WHERE

Sem WHERE, o comando vale para todas as linhas da tabela. Veja a aula O Perigo do UPDATE e DELETE sem WHERE antes de usar esses comandos num banco de verdade.


Criar e mudar tabelas

PalavraO que fazExemploAula
CREATE TABLECria uma tabelaCREATE TABLE notas (id INTEGER PRIMARY KEY, texto TEXT NOT NULL);CREATE TABLE
IF NOT EXISTSSó cria se ainda não existir (sem erro se já existe)CREATE TABLE IF NOT EXISTS notas (id INTEGER PRIMARY KEY, texto TEXT);CREATE TABLE
CREATE TABLE … ASCria uma tabela com o resultado de uma consultaCREATE TABLE caros AS SELECT nome, preco FROM produtos WHERE preco > 100;Criar Tabela a partir de Consulta
STRICTTabela rígida: recusa valores do tipo errado (só no SQLite)CREATE TABLE medidas (n INTEGER) STRICT;Os Tipos no SQLite
ALTER TABLE … ADD COLUMNAcrescenta uma colunaALTER TABLE clientes ADD COLUMN telefone TEXT;ALTER TABLE
ALTER TABLE … RENAMEMuda o nome de uma coluna (RENAME COLUMN … TO) ou da tabela (RENAME TO)ALTER TABLE clientes RENAME COLUMN vip TO cliente_vip;ALTER TABLE
DROP TABLEApaga a tabela inteira, com os dadosDROP TABLE itens_pedido;DROP TABLE
IF EXISTSSó apaga se existir (sem erro se não existe)DROP TABLE IF EXISTS rascunho;DROP TABLE
CREATE INDEXCria um índice, para as buscas ficarem mais rápidasCREATE INDEX idx_clientes_cidade ON clientes (cidade);Índices (CREATE INDEX)
CREATE VIEWGuarda uma consulta com um nome, para usar como se fosse tabelaCREATE VIEW vips AS SELECT nome FROM clientes WHERE vip = 1;Views

Regras das colunas (restrições)

PalavraO que fazExemploAula
PRIMARY KEYA coluna que identifica cada linha: única e nunca vaziaCREATE TABLE t (id INTEGER PRIMARY KEY, nome TEXT);PRIMARY KEY
AUTOINCREMENTNunca reaproveita um número de id já usadoCREATE TABLE t (id INTEGER PRIMARY KEY AUTOINCREMENT, nome TEXT);AUTOINCREMENT
NOT NULLA coluna não aceita ficar vaziaCREATE TABLE t (nome TEXT NOT NULL);NOT NULL
DEFAULTO valor usado quando o INSERT não diz nadaCREATE TABLE t (estoque INTEGER DEFAULT 0);DEFAULT
UNIQUENão deixa dois valores iguais na colunaCREATE TABLE t (email TEXT UNIQUE);UNIQUE
CHECKSó aceita valores que passam numa condiçãoCREATE TABLE t (preco REAL CHECK (preco >= 0));CHECK
FOREIGN KEY … REFERENCESA coluna aponta para o id de outra tabelaCREATE TABLE t (cat INTEGER, FOREIGN KEY (cat) REFERENCES categorias (id));FOREIGN KEY

Transações

PalavraO que fazExemploAula
BEGIN (ou BEGIN TRANSACTION)Começa uma transação: as mudanças só valem de vez no fimBEGIN; UPDATE produtos SET estoque = estoque - 1 WHERE id = 2; COMMIT;Transações (BEGIN e COMMIT)
COMMITConfirma as mudanças da transação(no exemplo acima)Transações (BEGIN e COMMIT)
ROLLBACKDesfaz as mudanças da transaçãoBEGIN; UPDATE produtos SET estoque = 0; ROLLBACK;ROLLBACK e Savepoints
SAVEPOINTMarca um ponto dentro da transação, para voltar até eleSAVEPOINT antes;ROLLBACK e Savepoints
ROLLBACK TODesfaz só o que veio depois do ponto marcadoROLLBACK TO antes;ROLLBACK e Savepoints
RELEASEApaga o ponto marcado (mantendo as mudanças)RELEASE antes;ROLLBACK e Savepoints

Os quatro juntos, numa transação só. O DELETE apaga 2 itens, o ROLLBACK TO os traz de volta, e a contagem final continua 220:

BEGIN;
SAVEPOINT antes;
DELETE FROM itens_pedido WHERE pedido_id = 90;
ROLLBACK TO antes;
RELEASE antes;
COMMIT;
SELECT count(*) FROM itens_pedido;

Ferramentas do SQLite

PalavraO que fazExemploAula
EXPLAIN QUERY PLANMostra como o banco vai procurar os dados (se usa índice ou lê tudo)EXPLAIN QUERY PLAN SELECT nome FROM clientes WHERE id = 5;EXPLAIN QUERY PLAN
PRAGMALê ou muda uma configuração do SQLitePRAGMA table_info(produtos);PRAGMAs Úteis
VACUUMReorganiza o arquivo do banco e devolve o espaço que sobrouVACUUM;VACUUM e ANALYZE
ANALYZEColeta estatísticas para o banco escolher melhor os índicesANALYZE;VACUUM e ANALYZE

Comandos que começam com ponto, como .tables e .schema, não são palavras-chave do SQL: são comandos do programa sqlite3 e só funcionam no terminal. Eles têm a sua própria referência: Comandos de Ponto do sqlite3.


A ordem das cláusulas num SELECT

As partes de um SELECT têm um lugar fixo. Nenhuma é obrigatória além do SELECT, mas as que aparecerem têm de vir nesta ordem:

OrdemCláusulaPergunta que responde
1WITHHá consultas com nome para usar abaixo?
2SELECT (DISTINCT)Quais colunas mostrar?
3FROM (+ JOIN … ON)De quais tabelas?
4WHEREQuais linhas?
5GROUP BYAgrupar por quê?
6HAVINGQuais grupos?
7ORDER BYEm que ordem?
8LIMIT (OFFSET)Quantas linhas, a partir de qual?

Uma consulta com quase todas elas. Quais estados têm mais de 2 clientes que não são VIP, do maior para o menor, no máximo 3:

SELECT estado, count(*) AS clientes
FROM clientes
WHERE vip = 0
GROUP BY estado
HAVING count(*) > 2
ORDER BY clientes DESC
LIMIT 3;

Experimente: mude a consulta: tire o WHERE, troque o DESC por ASC, mude o LIMIT. Veja como cada parte muda o resultado.

SELECT estado, count(*) AS clientes
FROM clientes
WHERE vip = 0
GROUP BY estado
HAVING count(*) > 2
ORDER BY clientes DESC
LIMIT 3;

Fora de ordem, vem erro de sintaxe. Aqui o ORDER BY veio antes do GROUP BY:

SELECT estado, count(*)
FROM clientes
ORDER BY estado
GROUP BY estado;

Missão: a consulta quer mostrar quantos clientes há em cada estado, em ordem alfabética de estado, mas as cláusulas estão fora de ordem. Ponha-as no lugar certo.

SELECT estado, count(*)
FROM clientes
ORDER BY estado
GROUP BY estado;
SELECT estado, count(*)
FROM clientes
GROUP BY estado
ORDER BY estado;

Uma coluna com nome de palavra-chave

As palavras-chave são reservadas: o banco as reconhece em qualquer lugar. Se você tentar dar a uma coluna o nome order ("pedido", em inglês, mas também o ORDER de ORDER BY), vem erro:

CREATE TABLE t (order INTEGER);

Entre aspas duplas, que no SQL servem para nomes, a palavra vira um nome comum e funciona:

CREATE TABLE t ("order" INTEGER);
SELECT * FROM t;

Funciona, mas daí em diante você vai ter de escrever "order" com aspas toda vez. O melhor é escolher outro nome: pedido, ordem, posicao. Em português, quase nunca há choque, e esse é um bom motivo para nomear as colunas na nossa língua, como a Loja Aurora faz.


Nos outros bancos

PalavraNo SQLite do guiaNos outros
ANY, SOME, ALL (com subconsulta)Não existem: syntax errorExistem no MySQL, no PostgreSQL e no SQL Server (aula ANY e ALL)
||Junta textosNo MySQL, é um "ou" (obsoleto), a não ser com o modo PIPES_AS_CONCAT (aula OR)
&&Não existe: syntax errorNo MySQL, é um "e" (obsoleto) (aula AND)
"texto"Aspas duplas são nomes: no editor, texto entre aspas duplas dá erro; o sqlite3 do Debian, no terminal, aceita calado se não houver coluna com aquele nomeNo MySQL, aspas duplas também podem ser texto, a não ser com o modo ANSI_QUOTES (aula WHERE)
STRICT, GLOB, PRAGMAExistemSão só do SQLite

As outras diferenças entre os bancos (como limitar linhas, criar números automáticos, os tipos de dados) estão em As Diferenças entre os Bancos e em Tipos de Dados.


Resumo

  • Palavras-chave são as palavras do próprio SQL. Não ligam para maiúsculas; o costume é escrevê-las em MAIÚSCULAS.
  • Consultar: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT, nessa ordem.
  • Mudar dados: INSERT, UPDATE, DELETE. Criar estruturas: CREATE, ALTER, DROP. Transações: BEGIN, COMMIT, ROLLBACK.
  • Uma palavra-chave não pode ser nome de coluna sem aspas duplas; prefira outro nome.
  • Comandos de ponto (.tables) não são SQL: são do programa sqlite3.