Consultas com SELECT

Aprenda a responder a perguntas usando os dados de uma tabela de banco de dados. Escolha colunas com SELECT e FROM, mantenha as linhas necessárias com WHERE, operadores de comparação, AND, OR e NOT, e busque correspondências em listas, intervalos e padrões de texto com IN, BETWEEN e LIKE. Encontre e trate valores ausentes com IS NULL, liste valores distintos com DISTINCT e ordene e limite resultados com ORDER BY e LIMIT. Os exemplos usam SQL executada no SQLite e no PostgreSQL, incluindo a cláusula LIMIT, amplamente utilizada, com observações sobre a forma padrão e as diferenças no MySQL, SQL Server e Oracle.

BásicoAula 2 de 6 do curso Curso de Noções básicas de SQL

O que você vai aprender

  1. Escrever consultas que leem colunas escolhidas de uma tabela, compreender o conjunto de resultados retornado e listar os valores distintos de uma coluna com DISTINCT.
    • Escrever uma consulta SELECT básica
      Indicar com SELECT as colunas a exibir e com FROM a tabela a ler, seguir as regras básicas de sintaxe e saber como é o resultado.
    • Listar valores distintos com DISTINCT
      Remover linhas repetidas de um resultado com SELECT DISTINCT e prever quantas linhas restam, inclusive quando há várias colunas ou valores ausentes.
  2. Manter apenas as linhas que respondem a uma pergunta, escrevendo condições com operadores de comparação para números, textos e datas e combinando condições com AND, OR e NOT.
    • Comparar números com operadores de comparação
      Usar WHERE com =, <>, <, >, <= e >= para selecionar linhas por valores numéricos e escolher o operador adequado ao enunciado de uma pergunta.
    • Comparar textos e datas corretamente
      Escrever valores de texto e de data na forma correta, prever como maiúsculas e minúsculas, ordem alfabética e formatos de data afetam uma comparação e evitar erros comuns com aspas e datas.
    • Combinar condições com AND, OR e NOT
      Unir várias condições com AND e OR, inverter uma condição com NOT e usar parênteses para que a consulta teste exatamente o que a pergunta pede.
  3. Tornar condições mais curtas e precisas com IN para listas de valores, BETWEEN para intervalos e LIKE para padrões de texto, incluindo suas formas com NOT e suas armadilhas comuns.
    • Buscar correspondências em uma lista de valores com IN
      Usar IN e NOT IN para manter linhas cujo valor é um dos vários valores listados e saber como listas interagem com AND e com valores ausentes.
    • Selecionar um intervalo com BETWEEN
      Usar BETWEEN e NOT BETWEEN para intervalos de números, datas e textos, sabendo que ambos os extremos estão incluídos e onde isso causa erros.
    • Buscar padrões de texto com LIKE
      Encontrar texto que começa ou termina com determinados caracteres ou os contém usando LIKE com % e _, e tratar a diferenciação entre maiúsculas e minúsculas, caracteres curinga literais e valores ausentes.
  4. Reconhecer NULL como valor ausente, encontrá-lo com IS NULL e IS NOT NULL e prever como valores ausentes alteram o resultado de todos os outros tipos de condição.
    • Encontrar valores ausentes com IS NULL
      Distinguir NULL de zero e de texto vazio e usar IS NULL e IS NOT NULL para encontrar linhas em que um valor está ou não registrado.
    • Prever como NULL afeta as condições
      Aplicar a lógica de três valores (verdadeiro, falso, desconhecido) a comparações, AND, OR, NOT, IN, BETWEEN e LIKE e decidir se linhas com valores ausentes pertencem a uma resposta.
  5. Colocar as linhas de resultado em uma ordem significativa com ORDER BY, ordenar por várias colunas tratando empates e valores ausentes e retornar as primeiras linhas ou uma página de linhas com LIMIT e OFFSET.
    • Ordenar linhas com ORDER BY
      Ordenar um resultado por uma coluna em ordem crescente ou decrescente e prever como números, datas e textos são ordenados.
    • Ordenar por várias colunas e tratar empates e valores NULL
      Ordenar por mais de uma coluna, com uma direção para cada uma, adicionar critérios de desempate para obter uma ordem reproduzível e controlar onde aparecem os valores ausentes.
    • Retornar as primeiras linhas e páginas com LIMIT e OFFSET
      Retornar as primeiras linhas de um resultado ordenado com LIMIT, pular linhas com OFFSET para mostrar páginas posteriores e escrever a mesma solicitação em outros dialetos SQL.
  6. Combinar todas as cláusulas em consultas corretas e legíveis, compreender a ordem em que uma consulta é processada e transformar perguntas cotidianas em consultas cujos resultados você verifica.
    • Colocar as cláusulas em ordem e compreender como uma consulta é executada
      Escrever SELECT, FROM, WHERE, ORDER BY e LIMIT na ordem exigida e usar a ordem lógica de processamento para prever o que cada cláusula pode acessar.
    • Transformar uma pergunta em uma consulta e verificar a resposta
      Transformar uma pergunta cotidiana em uma consulta a uma única tabela, passo a passo, e depois verificar limites, valores ausentes, maiúsculas e minúsculas e empates no resultado.

Guia de estudo de Consultas com SELECT

6 capítulos

1

Escolha os dados a exibir

Uma consulta útil começa com a escolha da tabela e das colunas que respondem à sua pergunta. O resultado pode mostrar todos os registros, alguns campos de cada registro ou uma lista de valores distintos. Você trabalhará com duas tabelas pequenas para poder relacionar cada resultado aos dados armazenados. Ler os nomes das colunas com atenção e distinguir a ordem das colunas da ordem das linhas facilitará a compreensão dos filtros e das ordenações a seguir.

1.1 SELECT, FROM e a tabela de resultado

Uma consulta solicita dados a um banco de dados. Uma consulta SELECT simples lê a tabela armazenada sem alterá-la. SELECT indica as colunas a exibir, e FROM indica a tabela a ler.

Os exemplos de texto usam a igualdade comum que diferencia maiúsculas de minúsculas no SQLite e no PostgreSQL. Configurações de colação podem alterar a comparação e a ordenação de texto.

Duas tabelas para trabalhar

A tabela employees tem estas oito linhas. salary é o salário anual em dólares; hire_date é texto no formato YYYY-MM-DD. NULL marca um valor ausente.

employee_idfirst_namelast_namedepartmentcitysalaryhire_datephone
1AnaLopezSalesChicago520002019-03-15312-555-0147
2BenCarterITDenver710002021-07-01NULL
3ChloeNguyenSalesChicago480002023-01-09312-555-0198
4DavidKimMarketingBoston600002020-11-23617-555-0110
5EmmaBrownSalesDenver650002018-05-30NULL
6FaridHaddadITChicago830002017-09-12312-555-0175
7GraceOkaforNULLBoston450002024-02-19617-555-0133
8HugoO'NeillMarketingChicago580002022-08-05NULL

A tabela products registra preços em dólares e estoque em unidades no depósito.

product_idnamecategorypricestock
1Desk LampLighting24,9940
2Floor LampLighting89,0012
3Lamp ShadeLighting15,500
4Office ChairFurniture149,008
5Standing DeskFurniture349,005
6Desk OrganizerStorage18,7560
7BookshelfFurniture120,00NULL
8Paper TrayStorage9,9925
Leia a estrutura da consulta
SELECT city, first_name
FROM employees;

O conjunto de resultados é outra tabela: oito linhas e duas colunas, com city primeiro. Não há filtro, então cada funcionário contribui com uma linha. A SQL não garante a ordem das linhas até você adicionar ORDER BY.

SELECT * FROM products; exibe todas as colunas na ordem definida pela tabela. O asterisco é útil para explorar. Em uma consulta salva, indicar as colunas mantém o resultado focado e impede que uma coluna recém-adicionada à tabela altere sua estrutura.

Torne a sintaxe legível

Separe as colunas com vírgulas, sem vírgula final antes de FROM. Termine a instrução com ponto e vírgula. As palavras-chave não diferenciam maiúsculas de minúsculas, então select funciona, mas as maiúsculas facilitam a identificação das cláusulas. Espaços e quebras de linha separam palavras; eles não alteram o significado desta consulta. Um comentário com -- continua até o fim da linha.

Os nomes devem corresponder aos do esquema. Se frist_name causar um erro de coluna inexistente, compare a grafia com first_name. A SQL padrão usa aspas duplas para nomes que contêm espaços ou palavras reservadas, como "order date". O PostgreSQL converte nomes sem aspas para minúsculas, enquanto "City" procura esse nome exatamente com a maiúscula. O MySQL normalmente usa crases; aspas duplas identificam nomes no modo ANSI_QUOTES. O SQL Server também aceita colchetes e aceita aspas duplas quando QUOTED_IDENTIFIER está ativado, sua configuração padrão.

Principais conclusões

  • SELECT escolhe as colunas exibidas; FROM identifica a tabela delas.
  • As colunas do resultado seguem a lista SELECT; a ordem das linhas exige ORDER BY.
  • SELECT * exibe todas as colunas; nomes explícitos mantêm as consultas salvas focadas.
  • Use vírgulas entre colunas e ponto e vírgula para encerrar uma instrução.
  • Confira os nomes no esquema e use as regras do banco de dados para delimitar identificadores com aspas.

1.2 Valores distintos e combinações distintas

Um valor repetido no resultado de uma consulta é frequentemente útil. Vários funcionários podem morar na mesma cidade, e cada um ainda precisa de uma linha. Use DISTINCT quando a pergunta pedir valores ou combinações distintos.

Escolha o que deve contar como duplicata
SELECT DISTINCT city
FROM employees;

O resultado contém Chicago, Denver e Boston, sem ordem garantida. O SELECT city simples retornaria oito linhas porque cada funcionário fornece uma cidade. Adicionar DISTINCT reduz essa exibição a três valores distintos. Isso mantém os oito registros de funcionários armazenados.

A comparação inclui todas as colunas selecionadas. Considere:

SELECT DISTINCT department, city
FROM employees;

Ana e Chloe contribuem com (Sales, Chicago), então esse par aparece uma vez. Emma contribui com (Sales, Denver), que é diferente e permanece. Os outros pares são (IT, Denver), (Marketing, Boston), (IT, Chicago), (NULL, Boston) e (Marketing, Chicago). Há sete linhas de resultado. Departamentos repetidos permanecem porque um departamento associado a outra cidade forma uma linha de resultado diferente.

Escreva DISTINCT uma vez, imediatamente após SELECT. Ele se aplica à linha selecionada inteira. Colocá-lo entre nomes de colunas, como em SELECT department, DISTINCT city, é um erro de sintaxe.

Observe quais colunas você inclui

Se você adicionar employee_id às colunas selecionadas, cada linha se tornará diferente. SELECT DISTINCT employee_id, city FROM employees; ainda retorna oito linhas: cada identificador é único, mesmo quando a cidade se repete. Para responder a “Quais cidades têm funcionários?”, selecione apenas a cidade. Para responder a “Quais funcionários moram em cada cidade?”, mantenha as colunas de identificação e espere cidades repetidas.

Nessa etapa de remoção de duplicatas, valores NULL repetidos são tratados como duplicatas. SELECT DISTINCT department FROM employees; retorna Sales, IT, Marketing e uma linha NULL. A linha NULL registra que um departamento está ausente; ela não é o nome de um quarto departamento. Essa regra de duplicatas difere de NULL = NULL, que resulta em desconhecido em um filtro.

Comparações de texto seguem uma colação, as regras do banco de dados para comparar e ordenar texto. Nas comparações comuns que diferenciam maiúsculas de minúsculas usadas nestes exemplos de SQLite e PostgreSQL, Chicago e chicago são valores diferentes. Uma lista DISTINCT pode revelar uso inconsistente de maiúsculas. Remover repetições da exibição não corrige a grafia nos dados armazenados.

Combine DISTINCT com uma lista curta ordenada
SELECT DISTINCT city
FROM employees
ORDER BY city
LIMIT 2;

Primeiro, as cidades duplicadas desaparecem. Em seguida, as três cidades são ordenadas. Por fim, restam duas linhas de resultado: Boston e Chicago, nessa ordem. Aplicar o limite primeiro às linhas de funcionários responderia a outra pergunta.

Em uma consulta DISTINCT, mantenha as colunas de ordenação na lista SELECT. O PostgreSQL exige isso; o SQLite permite algumas consultas que ordenam por uma coluna não selecionada, mas a escolha entre diferentes valores ocultos torna a ordenação difícil de interpretar. Se um resultado tiver repetições inesperadas, examine as colunas selecionadas antes de decidir que DISTINCT deve fazer parte da consulta.

Principais conclusões

  • DISTINCT remove linhas completas duplicadas do resultado sem alterar as linhas armazenadas.
  • Adicionar colunas altera quais linhas contam como duplicatas; uma chave única mantém todas as linhas distintas.
  • DISTINCT agrupa valores NULL repetidos.
  • As duplicatas são removidas antes de o resultado ordenado ser limitado.
2

Mantenha as linhas que respondem à pergunta

A filtragem transforma uma tabela em uma resposta sobre registros específicos: uma faixa salarial, uma cidade ou um grupo que atende a várias condições. Pequenas escolhas importam, inclusive se um extremo conta e se duas condições devem ser atendidas ao mesmo tempo. Comparações numéricas, valores de texto e de data e lógica agrupada têm suas próprias regras. Uma consulta pode ser executada com sucesso e ainda assim fazer a pergunta errada, então você acompanhará quais linhas passam em cada teste.

2.1 Números e valores de fronteira

A cláusula WHERE mantém uma linha somente quando sua condição é verdadeira. Ela vem depois de FROM e pode testar qualquer coluna da tabela, inclusive uma coluna que você não exibe.

Relacione as palavras ao operador
SolicitaçãoOperadorExemplo de condição
Igual a=stock = 0
Diferente de<>stock <> 0
Mais de>salary > 60000
Pelo menos>=salary >= 60000
Menos de<price < 20.50
No máximo<=price <= 20.50

<> é a forma da SQL padrão para “diferente de”. Os cinco bancos de dados discutidos aqui também aceitam !=. Use um sinal de igualdade para indicar igualdade. O SQLite aceita ==, mas o PostgreSQL rejeita essa forma.

Acompanhe uma linha no limite
SELECT first_name, salary
FROM employees
WHERE salary > 60000;

Ben ganha 71000, Emma ganha 65000 e Farid ganha 83000. Essas são as três linhas que atendem à condição, sem ordem determinada. David ganha exatamente 60000. Sua linha não passa em > 60000 porque “mais de” exclui a igualdade.

Altere apenas o operador para >=. David agora entra no resultado, que passa a ter quatro linhas. É assim que “pelo menos 60000” difere de “mais de 60000”. Uma verificação útil do limite pergunta o que acontece com um valor exatamente igual ao limite; valores muito acima dele não revelam esse erro.

Para “no máximo 20,50”, um preço de 20,50 passa e um preço de 20,51 não passa. Quando uma solicitação fornece um limite inferior e um superior, verifique cada extremo separadamente antes de unir os testes.

Escreva valores numéricos como números

Use apenas algarismos em condições SQL: 60000, sem separador de milhares ou símbolo de moeda. Uma vírgula separa itens em SQL; WHERE salary > 60,000 é um erro de sintaxe. Valores decimais usam ponto, como em WHERE price < 20.50. Salários e preços pertencem a colunas numéricas para que as comparações usem sua magnitude numérica.

Texto que parece numérico segue regras de texto quando comparado como texto. O valor de texto '9' é ordenado depois de '10' porque seu primeiro caractere vem depois. Isso informa sobre caracteres, não sobre nove ser maior que dez. Leia o tipo de dados da coluna antes de interpretar uma comparação inesperada.

Filtre sem exibir a coluna testada
SELECT first_name
FROM employees
WHERE salary < 50000;

Chloe e Grace passam. Seus salários são usados para testar as linhas, mas não aparecem no resultado. Você não precisa adicionar o salário a SELECT para que o filtro funcione. Ao verificar uma consulta, exibi-lo temporariamente pode ajudar você a examinar por que cada linha passou.

Uma igualdade em uma chave primária permite buscar diretamente um registro: WHERE employee_id = 6 encontra Farid. Uma chave primária identifica uma linha, então essa igualdade não pode retornar vários funcionários com o mesmo identificador.

Dados ausentes exigem cuidado separado. WHERE stock <> 0 retorna seis produtos. Lamp Shade fica de fora porque seu estoque conhecido é zero. Bookshelf também fica de fora: seu estoque é NULL, então a comparação é desconhecida e WHERE não o mantém. Um teste de “diferente de” não acrescenta valores ausentes ao resultado.

Principais conclusões

  • WHERE mantém apenas as linhas cuja condição é verdadeira.
  • > e < excluem seus limites; >= e <= os incluem.
  • Escreva literais numéricos sem símbolos de moeda, aspas ou separadores de milhares.
  • Um filtro pode testar uma coluna que não é exibida.
  • Use uma igualdade em uma chave para buscar um registro.
  • Comparações comuns com NULL não passam por um filtro WHERE.

2.2 Texto, aspas e datas completas

Condições de texto e de data precisam de valores em uma forma que o banco de dados possa interpretar. Um valor escrito incorretamente pode não retornar nenhuma linha sem gerar aviso, enquanto a falta de aspas pode transformar esse valor em um nome de coluna.

Distinga um valor de um nome
SELECT first_name
FROM employees
WHERE city = 'Chicago';

As aspas simples tornam 'Chicago' um valor de texto. O resultado contém Ana, Chloe, Farid e Hugo. Sem aspas, Chicago é interpretado como um nome, então o banco de dados procura uma coluna com esse nome. As aspas duplas padrão também delimitam nomes. O PostgreSQL rejeita city = "Chicago" quando essa coluna não existe. Algumas configurações do SQLite aceitam cadeias entre aspas duplas como recurso legado; use aspas simples para valores de forma consistente.

Um apóstrofo dentro de um valor é duplicado:

SELECT first_name
FROM employees
WHERE last_name = 'O''Neill';

Isso encontra Hugo. As duas aspas simples adjacentes representam um apóstrofo dentro do valor; as aspas externas marcam seu início e seu fim. A SQL padrão não usa uma barra invertida para escapar esse apóstrofo.

Verifique as regras de comparação

Uma colação controla a igualdade e a ordenação de texto, incluindo maiúsculas, minúsculas e letras acentuadas. Nas comparações comuns que diferenciam maiúsculas de minúsculas no SQLite e no PostgreSQL usadas aqui, 'Chicago' e 'chicago' são diferentes. WHERE city = 'chicago' não retorna linhas. MySQL e SQL Server costumam usar colações que ignoram maiúsculas e minúsculas, então suas configurações usuais podem encontrar ambas as grafias.

Comparações de intervalos de texto também seguem a colação. Com esses nomes, WHERE last_name < 'M' retorna Brown, Carter, Haddad, Kim e Lopez. Os valores são comparados a partir da esquerda. Um valor mais longo que começa com os mesmos caracteres vem depois de seu prefixo: 'Martin' vem depois de 'M'. Um limite de 'M' não é o mesmo que “todos os nomes que começam com M”.

Coloque o ano primeiro

A coluna hire_date do exemplo armazena datas completas como texto: ano, mês e depois dia, com larguras fixas. Isso faz com que a ordem do texto corresponda à ordem do calendário.

SELECT first_name, hire_date
FROM employees
WHERE hire_date >= '2022-01-01';

Chloe, Grace e Hugo passam. O PostgreSQL também tem um tipo DATE para datas reais que aceita esse literal. Sua forma padrão com tipo explícito é DATE '2022-01-01'; o SQLite não usa essa sintaxe de literal tipado.

Uma data em texto no formato local, como '03/04/2024', é ambígua em uma coluna de data porque as configurações podem interpretá-la como 4 de março ou 3 de abril. Armazenadas como texto, datas com o mês primeiro são comparadas pelo mês antes do ano. Por exemplo, '12/01/2021' é ordenado depois de '03/15/2024', embora a primeira data no calendário seja anterior.

Interprete o limite com a data completa

“Contratado após 2022” significa a partir de '2023-01-01'. Comparar o texto com '2022' também inclui o '2022-08-05' de Hugo: o texto mais longo é ordenado depois do prefixo correspondente.

Se uma coluna contiver horas, a igualdade com apenas uma data não seleciona todas as horas desse dia. Para incluir 31 de março de 2024, use ordered_at >= '2024-03-31' AND ordered_at < '2024-04-01'. Isso mantém todos os horários desde o início de 31 de março até o início de 1º de abril, sem incluí-lo.

Principais conclusões

  • Use aspas simples para valores de texto; duplique um apóstrofo dentro de um valor.
  • A colação determina como maiúsculas, minúsculas e caracteres de texto são comparados.
  • Use datas YYYY-MM-DD completas para que datas de texto com largura fixa sejam ordenadas cronologicamente.
  • Para cobrir um dia inteiro com horas, inclua seu início e exclua o início do dia seguinte.

2.3 AND, OR, NOT e condições agrupadas

Uma linha pode precisar passar em vários testes. AND exige que ambas as condições sejam verdadeiras. OR exige que pelo menos uma seja verdadeira. NOT inverte verdadeiro e falso; quando uma condição é desconhecida por causa de NULL, NOT a mantém desconhecida.

Decida se ambos os testes devem ser atendidos
SELECT first_name
FROM employees
WHERE department = 'Sales' AND city = 'Chicago';

Ana e Chloe passam nos dois testes. Emma trabalha em Sales, mas mora em Denver, então não passa nesse AND. Mudar AND para OR também inclui Emma, Farid e Hugo: os cinco funcionários que atendem à condição satisfazem um teste ou ambos.

Adicionar uma condição AND pode manter ou reduzir o resultado. Adicionar uma condição OR pode manter ou ampliar o resultado. Isso permite uma verificação rápida ao construir um filtro em etapas.

Toda comparação deve estar completa. Escreva department = 'IT' OR department = 'Marketing', repetindo a coluna e o operador. department = 'IT' OR 'Marketing' não expressa a segunda comparação. O PostgreSQL a rejeita; o SQLite trata o texto isolado como falso e retorna apenas funcionários de IT. Da mesma forma, escreva salary > 50000 AND salary < 70000, com salary dos dois lados de AND.

Interprete grupos de alternativas

“Funcionários em Boston e Denver” normalmente pede pessoas em qualquer uma das duas cidades. Cada linha tem uma cidade, então use city = 'Boston' OR city = 'Denver'. Isso retorna Ben, David, Emma e Grace. Um AND entre essas igualdades exige que um único valor de cidade seja os dois lugares ao mesmo tempo e não retorna linhas.

Quando operadores são combinados, NOT é avaliado antes de AND, e AND antes de OR. Sem parênteses:

WHERE department = 'Sales'
   OR department = 'Marketing' AND city = 'Chicago'

Isso significa funcionários de Sales em qualquer lugar, mais funcionários de Marketing em Chicago. Emma passa porque a comparação com Sales é suficiente. Para restringir ambos os departamentos a Chicago, agrupe as alternativas:

SELECT first_name
FROM employees
WHERE (department = 'Sales' OR department = 'Marketing')
  AND city = 'Chicago';

Agora Ana, Chloe e Hugo passam. Os parênteses submetem as duas opções de departamento a uma mesma exigência de cidade. Use-os para tornar claro um filtro que mistura AND e OR, mesmo quando a ordem padrão já estaria correta.

Inverta um grupo inteiro

NOT (city = 'Chicago' OR city = 'Denver') retorna David e Grace em Boston. Nenhuma das cidades listadas é permitida. Isso equivale a city <> 'Chicago' AND city <> 'Denver' para esses valores.

Usar OR entre esses dois testes de “diferente de” é uma armadilha comum. Uma linha de Chicago é diferente de Denver, e uma linha de Denver é diferente de Chicago. Todo funcionário com uma cidade registrada passa em pelo menos um teste, então o OR não exclui nenhuma das duas cidades.

Construa uma condição complexa por partes. Verifique as linhas depois do primeiro teste e depois de adicionar o seguinte. Você pode trocar os dois lados de um AND ou os dois lados de um OR sem alterar a resposta; escolha a disposição que torne os grupos mais fáceis de ler.

Principais conclusões

  • AND exige ambas as condições; OR exige pelo menos uma.
  • Escreva uma comparação completa de cada lado de um operador lógico.
  • NOT é avaliado antes de AND e depois OR; parênteses explicitam o agrupamento pretendido.
  • Alternativas para uma coluna geralmente precisam de OR, mesmo quando a solicitação diz “e”.
  • Para excluir ambas as correspondências, negue o grupo com OR ou una as duas exclusões com AND.
3

Busque correspondências em listas, intervalos e padrões de texto

Algumas perguntas pedem várias opções exatas, outras pedem uma faixa de valores ou parte de um nome. IN, BETWEEN e LIKE dão uma forma clara a cada tipo de solicitação. A escolha entre eles começa pelo significado de uma correspondência: um valor inteiro, um valor entre extremos ou um texto que se ajusta a um padrão. Você também verificará valores ausentes e detalhes que alteram uma resposta, incluindo a inclusão dos extremos, a posição dos caracteres curinga e a diferenciação entre maiúsculas e minúsculas.

3.1 Listas de opções exatas com IN

Use IN quando uma coluna puder corresponder a qualquer valor de uma lista. Ele encurta um grupo de igualdades unidas por OR, mantendo seu significado.

Crie uma lista de alternativas
SELECT first_name
FROM employees
WHERE department IN ('IT', 'Marketing');

Ben, David, Farid e Hugo passam. Cada um tem um dos dois valores de departamento. O mesmo teste poderia ser escrito como department = 'IT' OR department = 'Marketing'.

Coloque os itens da lista entre parênteses, separados por vírgulas. Coloque texto entre aspas; deixe valores numéricos sem aspas. Por exemplo, employee_id IN (2, 4, 6) seleciona Ben, David e Farid. A ordem dos itens da lista não ordena o resultado. Repetir um item não repete uma linha correspondente: IN (6, 2, 2, 4) seleciona os mesmos registros. Use ORDER BY se precisar de uma ordem para o resultado.

IN busca correspondências de valores inteiros segundo as mesmas regras de comparação da igualdade. city IN ('Chi') não corresponde a Chicago. Nas comparações comuns que diferenciam maiúsculas de minúsculas usadas aqui, city IN ('chicago') também não corresponde. Uma busca por fragmento precisa de LIKE, enquanto o tratamento de maiúsculas e minúsculas depende da colação.

Aplique outra regra a todas as opções
SELECT first_name
FROM employees
WHERE department IN ('IT', 'Marketing')
  AND city = 'Chicago';

Farid e Hugo passam. IN é uma condição, então AND aplica o teste de cidade a toda a escolha de departamentos. Na versão expandida com OR, coloque parênteses em torno das duas comparações de departamento. Sem eles, department = 'IT' OR department = 'Marketing' AND city = 'Chicago' também inclui Ben, pois AND tem precedência maior e a regra de cidade se aplica apenas a Marketing.

Exclua os valores listados

WHERE city NOT IN ('Chicago', 'Denver') retorna David e Grace. Uma cidade registrada passa somente quando é diferente das duas entradas. Essa é uma forma útil para várias exclusões e evita o erro de unir condições de “diferente de” com OR.

Valores ausentes não correspondem a nenhuma das duas formas. Grace tem departamento NULL, então department NOT IN ('Sales') não a inclui. O banco de dados não consegue determinar que o departamento ausente é diferente de Sales. Para incluir também funcionários sem departamento atribuído, escreva department NOT IN ('Sales') OR department IS NULL.

Um NULL dentro de uma lista NOT IN cria um problema mais amplo. department NOT IN ('Sales', NULL) exige tanto department <> 'Sales' quanto department <> NULL. A segunda comparação é sempre desconhecida, então o teste combinado nunca é verdadeiro e WHERE não retorna linhas. Mantenha os testes de valores ausentes separados da lista de valores.

Com IN, uma correspondência real ainda passa mesmo que outro item da lista seja NULL. department IN ('Sales', NULL) mantém os três funcionários de Sales, mas não adiciona Grace. Use IS NULL para solicitar explicitamente valores ausentes.

Uma lista IN comum em SQL precisa de pelo menos um item. O PostgreSQL rejeita IN (); o SQLite o aceita como falso. Se um programa criar uma lista a partir das escolhas do usuário, trate uma lista vazia antes de enviar a consulta para que o comportamento seja intencional nos diferentes bancos de dados.

Principais conclusões

  • IN encontra correspondência com qualquer valor inteiro em sua lista entre parênteses, separada por vírgulas.
  • A ordem da lista e as entradas repetidas não controlam a ordem do resultado nem duplicam as linhas correspondentes.
  • IN se combina com AND como uma única condição.
  • NOT IN exclui os valores listados, mas não inclui valores ausentes.
  • Um NULL dentro de uma lista NOT IN impede que qualquer linha passe pelo teste WHERE.

3.2 Intervalos e extremos incluídos

BETWEEN testa um intervalo com ambos os extremos incluídos. Use-o quando “de” e “até” incluírem os valores de fronteira indicados; use comparações explícitas quando algum limite precisar ser excluído.

Verifique os dois extremos
SELECT name, price
FROM products
WHERE price BETWEEN 15.50 AND 89.00;

Desk Lamp, Floor Lamp, Lamp Shade e Desk Organizer passam. Floor Lamp custa exatamente 89,00 e Lamp Shade exatamente 15,50, então ambos permanecem. A condição significa price >= 15.50 AND price <= 89.00.

Coloque o menor valor primeiro. price BETWEEN 89.00 AND 15.50 pede um preço de pelo menos 89,00 e no máximo 15,50. É uma sintaxe válida, mas não há correspondências. O BETWEEN comum não reordena os extremos para você. O PostgreSQL oferece BETWEEN SYMMETRIC para fazer isso, mas use a forma com o menor valor primeiro para uma consulta compartilhada com o SQLite.

Para “mais de 15,50 e menos de 89,00”, escreva price > 15.50 AND price < 89.00. Apenas Desk Lamp e Desk Organizer passam. Essa diferença diz respeito aos extremos da pergunta, não à forma como o resultado é exibido.

Fora de um intervalo

price NOT BETWEEN 20 AND 100 significa price < 20 OR price > 100. Ele retorna Lamp Shade, Office Chair, Standing Desk, Desk Organizer, Bookshelf e Paper Tray. Valores exatamente iguais a 20 ou 100 estariam dentro do intervalo original e não passariam em NOT BETWEEN.

Um valor testado ausente resulta em desconhecido em qualquer um dos dois testes. Para estoque, BETWEEN 5 AND 40 seleciona cinco produtos e NOT BETWEEN seleciona dois: Lamp Shade com 0 e Desk Organizer com 60. Bookshelf tem estoque NULL e não pertence a nenhum dos resultados. Portanto, um intervalo e sua negação não precisam abranger todas as linhas armazenadas.

Datas e horas

Datas completas em texto na ordem YYYY-MM-DD permitem usar intervalos de datas. hire_date BETWEEN '2020-01-01' AND '2022-12-31' seleciona Ben, David e Hugo, abrangendo os três anos do calendário nessa coluna que contém apenas datas.

Uma coluna que contém horas precisa de um limite superior diferente para um mês inteiro. Um extremo que contém apenas a data em uma coluna de data e hora significa meia-noite no início desse dia. Como texto, até '2024-03-31 00:00:00' é ordenado depois do prefixo mais curto '2024-03-31'. Para incluir todos os horários de março, use:

WHERE ordered_at >= '2024-03-01'
  AND ordered_at < '2024-04-01'

Isso inclui o início de março e termina imediatamente antes de abril, sem precisar adivinhar a última fração de segundo de 31 de março.

Intervalos de texto e os dois usos de AND

Extremos de texto são valores completos. last_name BETWEEN 'A' AND 'C' inclui Brown, mas exclui Carter, pois Carter é ordenado depois de seu prefixo C. Segundo essas regras de texto, last_name >= 'A' AND last_name < 'D' abrange nomes que começam com A, B ou C e retorna Brown e Carter.

Em price BETWEEN 10 AND 100 AND category = 'Lighting', o primeiro AND separa os extremos do intervalo; o segundo une o teste do intervalo ao teste da categoria. Os produtos correspondentes são Desk Lamp, Floor Lamp e Lamp Shade. Quebras de linha podem facilitar a visualização dos dois papéis.

Principais conclusões

  • BETWEEN inclui ambos os extremos e espera o extremo inferior primeiro.
  • NOT BETWEEN seleciona valores abaixo do extremo inferior ou acima do extremo superior.
  • Comparações explícitas permitem excluir um ou ambos os extremos.
  • Para um mês inteiro com horas, inclua seu início e termine antes do mês seguinte.
  • Um extremo de texto é um valor inteiro, não todos os valores com aquela letra inicial.
  • NULL na coluna testada não passa em nenhum dos dois testes de intervalo.

3.3 Padrões de texto com LIKE

LIKE testa um texto em relação a um padrão. Use-o para buscar um início, um final ou um fragmento quando a igualdade exigiria um valor inteiro exato.

Posicione os caracteres curinga
PadrãoSignificadoNomes de produtos correspondentes
'Lamp%'Começa com LampLamp Shade
'%Lamp'Termina com LampDesk Lamp, Floor Lamp
'%Lamp%'Contém LampDesk Lamp, Floor Lamp, Lamp Shade
'Lamp'Exatamente LampNenhum

O padrão deve corresponder ao valor inteiro. % pode representar zero ou mais caracteres, incluindo espaços. Em '%Lamp%', qualquer um dos sinais de porcentagem pode corresponder a nenhum caractere, então o texto pode começar ou terminar com Lamp, além de contê-lo no meio.

_ representa exatamente um caractere. last_name LIKE '_im' encontra Kim. Quatro sublinhados em first_name LIKE '____' encontram Emma e Hugo, os nomes com exatamente quatro letras. O sublinhado não é um caractere opcional.

SELECT first_name, phone
FROM employees
WHERE phone LIKE '312-%';

Ana, Chloe e Farid passam porque o texto de telefone registrado começa com 312-. O sinal de porcentagem abrange todos os caracteres restantes.

Escolha o operador e a regra de maiúsculas e minúsculas

Caracteres curinga pertencem a padrões LIKE. name = '%Lamp%' procura sinais de porcentagem literais e não retorna produtos aqui. Os caracteres curinga de busca de arquivos * e ? não têm significado especial em LIKE; name LIKE 'Desk*' procura um asterisco literal depois de Desk.

O LIKE do SQLite normalmente ignora maiúsculas e minúsculas para as letras ASCII de A a Z, enquanto o LIKE comum do PostgreSQL as diferencia. Assim, name LIKE '%desk%' encontra Desk Lamp, Standing Desk e Desk Organizer no SQLite, mas nenhum no PostgreSQL com uma colação que diferencia maiúsculas de minúsculas. O PostgreSQL também oferece ILIKE, que ignora essa diferença. O comportamento do MySQL segue a colação.

Para os nomes de produtos ASCII usados aqui, LOWER(name) LIKE '%desk%' fornece as mesmas correspondências no SQLite e no PostgreSQL: LOWER converte o nome para minúsculas antes da comparação. A conversão entre maiúsculas e minúsculas em outros sistemas de escrita depende das regras do banco de dados e do idioma. A igualdade no SQLite também difere de seu LIKE: city = 'chicago' não encontra Chicago com a colação binária padrão, embora city LIKE 'chicago' o encontre.

Busque um caractere curinga literal

Para encontrar um sublinhado literal, escolha um caractere de escape:

WHERE code LIKE 'SPRING!_%' ESCAPE '!'

Em uma tabela de códigos de desconto, isso corresponde a 'SPRING_10', mas não a 'SPRINGS10'. O !_ é um sublinhado real; o último % continua correspondendo a uma sequência. Use a mesma abordagem com !% para um sinal de porcentagem literal. Escrever ESCAPE explicitamente evita depender dos padrões do banco de dados; o PostgreSQL normalmente usa uma barra invertida e o SQLite não tem caractere de escape padrão.

Negação e tamanho da busca

name NOT LIKE '%Lamp%' retorna os outros cinco produtos. Texto ausente não passa nem em LIKE nem em NOT LIKE. Entre os funcionários, três telefones correspondem a '312-%', dois telefones registrados não correspondem e os três telefones NULL não aparecem em nenhum dos resultados.

Um % no início não fornece a um índice comum um texto inicial fixo para restringir a busca, então uma grande parte da tabela pode ser percorrida. Um início fixo como 'Desk%' pode ajudar um índice adequado. Para datas, use intervalos de datas: LIKE funciona nessas datas de texto, mas o PostgreSQL exige conversão antes de aplicar LIKE a uma coluna DATE real.

Principais conclusões

  • LIKE compara o valor inteiro; % abrange qualquer quantidade de caracteres e _ exatamente um.
  • Coloque % no início, no fim ou em ambos para controlar onde um fragmento pode aparecer.
  • O tratamento de maiúsculas e minúsculas varia conforme o banco de dados e a colação; LOWER ajuda com esses nomes ASCII.
  • ESCAPE permite que um caractere curinga represente seu caractere literal.
  • NULL não corresponde nem a LIKE nem a NOT LIKE.
  • Caracteres curinga no início podem fazer uma busca percorrer mais dados; use intervalos para datas.
4

Considere os valores ausentes

Dados ausentes alteram quais registros um filtro pode encontrar. Uma contagem de estoque igual a zero, uma cadeia de telefone vazia e um valor não registrado informam coisas diferentes, mesmo que uma ferramenta de consulta faça algumas células parecerem iguais. Você usará testes explícitos de valores ausentes e acompanhará o terceiro valor lógico, desconhecido. Essas regras explicam por que um filtro e seu oposto podem excluir as mesmas linhas e como incluí-las quando a pergunta exigir.

4.1 NULL, zero e texto vazio

NULL marca um valor ausente: um valor pode ser desconhecido, não registrado ou não aplicável. Ele é diferente de um zero conhecido ou de um texto conhecido sem caracteres.

Entenda o que significa um valor ausente

Lamp Shade tem stock = 0. Sua quantidade registrada é zero, portanto está sem estoque. Bookshelf tem stock NULL: a quantidade não foi registrada. O banco de dados não pode informar que há zero unidades nem qualquer outra quantidade.

A distinção muda a pergunta que você pode responder:

PerguntaCondiçãoResultado
Quais produtos estão sem estoque?stock = 0Lamp Shade
Quais quantidades em estoque são desconhecidas?stock IS NULLBookshelf
Quais quantidades estão registradas?stock IS NOT NULLOs outros sete produtos

Uma célula que parece vazia em uma ferramenta de consulta não basta para distinguir esses estados. Algumas ferramentas mostram NULL como uma célula vazia; outras exibem NULL. Teste diretamente o valor armazenado.

Use os testes de valores ausentes
SELECT first_name
FROM employees
WHERE phone IS NULL;

Ben, Emma e Hugo não têm telefone registrado. IS NULL resulta em verdadeiro para seus valores ausentes. Para encontrar os cinco funcionários com telefone registrado, use phone IS NOT NULL: Ana, Chloe, David, Farid e Grace.

Não escreva phone = NULL para encontrar telefones ausentes. Uma comparação comum que envolve NULL resulta em desconhecido, mesmo quando ambos os lados são NULL. WHERE mantém apenas as linhas verdadeiras, então = NULL não retorna nenhuma. <> NULL tem o mesmo problema. IS NULL é um teste do marcador de ausência e fornece uma resposta definida, verdadeira ou falsa, para esses valores de uma única coluna.

A forma NOT phone IS NULL também encontra telefones presentes no SQLite e no PostgreSQL, mas phone IS NOT NULL torna o teste pretendido mais fácil de ler.

Separe três tipos de texto
Expressão SQLO que representa
NULLUm valor ausente
''Um valor de texto conhecido com zero caracteres
'NULL'Quatro letras comuns

SQLite, PostgreSQL, MySQL e SQL Server distinguem texto vazio de NULL. phone = '' encontraria cadeias vazias, não os telefones ausentes de Ben, Emma ou Hugo. Se uma coluna puder conter ambos, use phone IS NULL OR phone = '' para encontrar qualquer um dos estados. O Oracle trata um valor de texto vazio como NULL, então essa distinção muda quando você troca de banco de dados.

Aplique o enunciado e o esquema

“Ausente”, “não registrado” e “não atribuído” indicam IS NULL. department IS NULL encontra Grace. Seu departamento ausente não significa que o texto do departamento seja a palavra 'NULL', nem estabelece a qual departamento ela pertence.

A definição da tabela pode marcar uma coluna como NOT NULL, o que significa que uma linha armazenada não pode ter NULL nessa coluna. Uma consulta IS NULL nessa coluna não retorna linhas. Verifique essa regra ao examinar um esquema: colunas que permitem dados ausentes precisam de atenção especial quando você cria exclusões ou combina condições.

Principais conclusões

  • NULL é um marcador de ausência; zero e texto vazio são valores conhecidos.
  • IS NULL encontra valores ausentes, e IS NOT NULL encontra valores presentes.
  • = NULL e <> NULL não conseguem encontrar linhas por meio de comparações comuns.
  • 'NULL' entre aspas é texto, e o Oracle trata texto vazio de forma diferente dos outros bancos de dados apresentados.
  • Uma coluna NOT NULL não pode armazenar NULL.

4.2 Verdadeiro, falso e desconhecido

Uma condição em SQL pode ser verdadeira, falsa ou desconhecida. Valores ausentes tornam o terceiro estado necessário: sem uma quantidade registrada, um banco de dados não consegue determinar se essa quantidade está acima de um limite.

Uma condição e seu oposto

Para Bookshelf, stock > 10 é desconhecido porque o estoque é NULL. O mesmo vale para stock <= 10. WHERE mantém apenas condições verdadeiras e exclui tanto as falsas quanto as desconhecidas.

Na tabela de produtos, stock > 10 retorna quatro linhas e stock <= 10 retorna três. Juntas, elas abrangem sete dos oito produtos. Bookshelf está ausente de ambas. Aplicar NOT não o recupera: NOT desconhecido é desconhecido, então NOT (stock > 10) ainda seleciona apenas as três quantidades conhecidas de no máximo 10.

Isso difere de um valor que não atende a uma condição. O zero conhecido de Lamp Shade torna stock > 10 falso, então NOT o torna verdadeiro. Uma quantidade ausente não fornece uma comparação definida desse tipo para inverter.

Combine desconhecido com outro teste
CombinaçãoResultado
Desconhecido AND falsoFalso
Desconhecido AND verdadeiroDesconhecido
Desconhecido AND desconhecidoDesconhecido
Desconhecido OR verdadeiroVerdadeiro
Desconhecido OR falsoDesconhecido
Desconhecido OR desconhecidoDesconhecido

Bookshelf custa 120,00. Em stock > 10 OR price > 100, a condição de preço é verdadeira. OR precisa de apenas uma parte verdadeira, então a linha é mantida mesmo que a comparação do estoque seja desconhecida. Em stock > 10 AND price > 100, a condição de estoque continua sem resolução, então o resultado é desconhecido e a linha é excluída.

Inclua valores ausentes deliberadamente
SELECT first_name
FROM employees
WHERE department <> 'Sales'
   OR department IS NULL;

Isso retorna Ben, David, Farid, Hugo e Grace. A comparação sozinha retornaria quatro, deixando Grace de fora. O ramo IS NULL inclui explicitamente funcionários cujo departamento não foi atribuído. Se esses funcionários pertencem a “fora de Sales” é uma questão sobre a resposta pretendida; a consulta deve expressar essa escolha.

Um valor NULL em uma lista NOT IN pode bloquear o resultado inteiro. department NOT IN ('Sales', NULL) significa que o departamento deve ser diferente de Sales e diferente de NULL. A última comparação é desconhecida para todas as linhas, então a condição completa nunca é verdadeira. IN ainda mantém correspondências reais: department IN ('Sales', NULL) seleciona os três funcionários de Sales, mas não encontra Grace.

Um valor testado ausente também produz desconhecido para LIKE e para um intervalo BETWEEN comum. IS NULL e IS NOT NULL fornecem respostas definidas para essas colunas escalares. Verifique valores ausentes com esses testes separadamente quando uma contagem de linhas parecer surpreendente.

Saiba quando valores NULL são agrupados

NULL = NULL continua sendo desconhecido; não se sabe se dois números de telefone ausentes são o mesmo número. DISTINCT, porém, trata valores ausentes repetidos como duplicatas, e ORDER BY os coloca juntos. Para uma comparação que trata deliberadamente dois valores NULL como iguais, SQLite e PostgreSQL também oferecem IS NOT DISTINCT FROM.

Principais conclusões

  • WHERE mantém linhas verdadeiras e remove linhas falsas e desconhecidas.
  • NOT mantém desconhecido sem alteração; filtros negados ainda podem deixar de fora linhas com NULL.
  • Um ramo verdadeiro de OR pode manter uma linha com outro ramo desconhecido.
  • Adicione IS NULL explicitamente quando valores ausentes devem fazer parte da resposta.
  • Um NULL em uma lista NOT IN significa que nenhuma linha pode passar por esse filtro de exclusão.
  • A remoção de duplicatas agrupa valores NULL, embora a igualdade comum de NULL seja desconhecida.
5

Ordene resultados e escolha uma página

Um limite de linhas só ganha significado depois que você decide quais linhas devem vir primeiro. A ordenação pode organizar números, textos ou datas, e colunas de ordenação posteriores resolvem empates nas anteriores. Valores ausentes e linhas empatadas exigem atenção quando uma lista curta ou uma página precisa ser reproduzível. Você criará ordenações totais, aplicará limites após a filtragem e reconhecerá as diferentes sintaxes de limite de linhas usadas por sistemas de banco de dados comuns.

5.1 Ordem crescente e decrescente

ORDER BY define a ordem das linhas do resultado. Sem ele, a SQL não garante qual linha aparece primeiro, mesmo quando uma tabela pequena parece retornar a mesma ordem todas as vezes.

Escolha a direção
DireçãoNúmerosDatas completasTexto
ASCMenor primeiroMais antiga primeiroOrdem da colação
DESCMaior primeiroMais recente primeiroOrdem inversa da colação

ASC é o padrão. ORDER BY salary e ORDER BY salary ASC solicitam a mesma direção. “Maior salário primeiro” exige ORDER BY salary DESC.

SELECT first_name, salary
FROM employees
ORDER BY salary DESC;

Leia o resultado do maior para o menor: Farid 83000, Ben 71000, Emma 65000, David 60000, Hugo 58000, Ana 52000, Chloe 48000 e Grace 45000. O banco de dados reorganiza as linhas do resultado; essa consulta não altera a tabela armazenada.

Filtre antes de ordenar
SELECT name, price
FROM products
WHERE category = 'Lighting'
ORDER BY price;

Apenas as três linhas de Lighting entram nesse resultado. Seus preços em ordem crescente produzem Lamp Shade 15,50, Desk Lamp 24,99 e depois Floor Lamp 89,00. ORDER BY vem depois de WHERE na instrução. Inverter essas cláusulas é um erro de sintaxe.

A coluna de ordenação não precisa ser exibida. SELECT first_name FROM employees ORDER BY salary DESC; fornece a mesma ordem de nomes sem mostrar os salários. O PostgreSQL restringe isso quando DISTINCT está presente: uma consulta DISTINCT deve selecionar suas colunas de ordenação.

Leia o tipo de dados armazenado

Colunas numéricas são ordenadas por magnitude numérica. Colunas de texto são ordenadas por caracteres segundo sua colação. Os valores de texto '10', '9' e '100' são ordenados como '10', '100', '9' segundo a ordenação comum de caracteres. Essa não é uma classificação numérica correta, portanto verifique o tipo da coluna quando os valores parecerem fora de ordem.

Os valores de hire_date do exemplo são datas completas em texto, com largura fixa e ano primeiro. ORDER BY hire_date começa com Farid em 2017-09-12 e termina com Grace em 2024-02-19. DESC inverte essa ordem para apresentar as contratações mais recentes primeiro. Datas de texto com o mês primeiro, como MM/DD/YYYY, são comparadas pelo mês antes do ano e não podem fornecer uma ordem cronológica confiável entre anos.

A ordem do texto depende da colação

A colação binária padrão do SQLite coloca letras ASCII maiúsculas antes das minúsculas. Segundo essa regra, 'Zebra' precede 'apple', e 'é' vem depois de 'z'. Muitos bancos de dados PostgreSQL usam colações que consideram o idioma e produzem outra ordem. O uso consistente de maiúsculas ajuda, mas as regras de comparação do banco de dados ainda determinam a ordem dos caracteres acentuados e de outros caracteres.

Use nomes de colunas para especificar a ordenação com clareza. ORDER BY 2 DESC significa o segundo item da lista SELECT, então mover colunas pode alterar silenciosamente a ordenação. ORDER BY 'salary' indica uma constante de texto, não a coluna de salário: o SQLite não obtém uma ordenação útil com isso, e o PostgreSQL o rejeita. Escreva ORDER BY salary.

Principais conclusões

  • ORDER BY determina a ordem das linhas; ASC é o padrão e DESC inverte a direção.
  • WHERE filtra linhas antes de elas serem ordenadas.
  • A magnitude numérica, a representação das datas e a colação do texto determinam o que significa “crescente”.
  • Indique explicitamente as colunas de ordenação para evitar constantes entre aspas e mudanças de posição das colunas.

5.2 Várias colunas de ordenação, empates e valores ausentes

Uma segunda coluna de ordenação só importa quando há empate na primeira. Pense em uma lista ordenada de funcionários: agrupe primeiro por cidade e depois ordene os nomes dentro de cada cidade.

Acompanhe as colunas de ordenação da esquerda para a direita
SELECT last_name, city
FROM employees
ORDER BY city, last_name;

O resultado começa com Kim e Okafor em Boston. Depois vêm Haddad, Lopez, Nguyen e O'Neill em Chicago. Brown e Carter em Denver vêm por último. last_name não compete com city; ele determina a ordem apenas dentro de uma mesma cidade.

Inverter as colunas altera a ordem principal. ORDER BY last_name, city ordena principalmente pelo sobrenome e consulta a cidade apenas quando há empate nos sobrenomes. Use uma cláusula ORDER BY com vírgulas entre suas colunas de ordenação. Uma segunda cláusula ORDER BY é inválida.

Defina a direção de cada coluna

ORDER BY department, salary DESC significa departamento em ordem crescente e depois salário em ordem decrescente dentro de cada departamento. DESC pertence apenas a salary. Para colocar ambos em ordem decrescente, escreva department DESC, salary DESC.

Na ordenação padrão de NULL do SQLite, a primeira forma coloca o departamento ausente de Grace primeiro. IT vem em seguida com Farid e depois Ben; Marketing tem David e depois Hugo; Sales tem Emma, Ana e depois Chloe. Você está lendo uma hierarquia de comparações, não ordenando primeiro todas as linhas por salário e depois ignorando essa ordem.

Resolva um empate com um valor único

Linhas iguais em todas as colunas de ordenação podem aparecer em qualquer ordem. ORDER BY city não determina qual funcionário de Chicago vem primeiro. Uma ordenação total acrescenta uma última coluna que identifica cada linha de forma única:

SELECT first_name, city
FROM employees
ORDER BY city, employee_id;

Os identificadores resolvem todos os empates de cidade. Para dados inalterados, isso faz com que um LIMIT ou uma página posterior selecione uma parte reproduzível da lista ordenada. Um critério de desempate único determina quais linhas aparecem em um ponto de corte; ele não inclui linhas empatadas adicionais.

Posicione valores ausentes deliberadamente

Os padrões dos bancos de dados diferem:

Banco de dadosNULL em ordem ASCNULL em ordem DESC
SQLite, MySQL, SQL ServerPrimeiroÚltimo
PostgreSQL, OracleÚltimoPrimeiro

Assim, a consulta de departamento coloca Grace por último no PostgreSQL com seu padrão, embora a coloque primeiro no SQLite. Essa diferença é independente da direção do salário.

SELECT first_name, department, salary
FROM employees
ORDER BY department NULLS LAST, salary DESC;

SQLite 3.30 ou posterior, PostgreSQL e Oracle oferecem suporte a NULLS FIRST e NULLS LAST. Aqui, eles colocam Grace depois de todos os departamentos registrados, mantendo a ordem salarial dentro de cada departamento. MySQL e SQL Server não aceitam essas cláusulas.

Interprete uma hierarquia solicitada na mesma sequência em que é enunciada: “por departamento, com os maiores salários primeiro em cada departamento” fornece department, salary DESC. “Em ordem alfabética por sobrenome e depois por nome” fornece last_name, first_name. Acrescente um identificador por último quando precisar de uma ordem reproduzível entre pessoas com nomes idênticos.

Principais conclusões

  • Colunas posteriores de ORDER BY resolvem empates nas anteriores.
  • ASC ou DESC se aplica à sua própria coluna; direções omitidas assumem ASC como padrão.
  • Adicionar uma coluna de ordenação final única torna a ordem total para dados inalterados.
  • A posição de NULL depende do banco de dados; as cláusulas NULLS FIRST/LAST, quando disponíveis, definem-na explicitamente.
  • Um critério de desempate determina a escolha das linhas sem ampliar um LIMIT para incluir todos os empates.

5.3 Primeiros resultados e páginas com LIMIT

LIMIT mantém no máximo uma quantidade escolhida de linhas de resultado. Ele não decide quais linhas devem vir primeiro. Use ORDER BY para dar a uma lista curta um significado como maior salário, mais recente ou mais barato.

Ordene e depois corte
SELECT first_name, salary
FROM employees
ORDER BY salary DESC
LIMIT 3;

Os salários ordenados começam com Farid 83000, Ben 71000 e Emma 65000, então essas três linhas permanecem. Sem ORDER BY, LIMIT 3 retorna três linhas quaisquer, sem garantia de que sejam as pessoas com os maiores salários.

WHERE atua antes do limite. WHERE city = 'Boston' ORDER BY salary DESC LIMIT 5 retorna apenas David e Grace porque apenas dois funcionários atendem à condição. LIMIT é um máximo, não uma solicitação para inventar linhas adicionais. LIMIT 0 não retorna nenhuma.

Pule linhas para uma página posterior

OFFSET pula linhas antes de LIMIT contar as linhas a retornar. ORDER BY salary DESC LIMIT 3 OFFSET 3 pula Farid, Ben e Emma e depois retorna David, Hugo e Ana: posições quatro a seis.

Para a página k com n linhas por página, pule (k − 1) × n linhas. A página três com três linhas por página usa LIMIT 3 OFFSET 6. Restam apenas Chloe e Grace. A primeira página tem deslocamento zero, não um.

“Segunda linha” e “segundo valor distinto” são solicitações diferentes. ORDER BY salary DESC LIMIT 1 OFFSET 1 retorna Ben com 71000 aqui. Se dois funcionários compartilhassem o maior salário, essa consulta retornaria outra pessoa com o maior salário. Para encontrar o segundo salário distinto, selecione DISTINCT salary antes de ordenar e pular linhas.

Resolva o ponto de corte

ORDER BY city LIMIT 3 inclui os dois funcionários de Boston e um de Chicago, mas não especifica qual funcionário de Chicago. ORDER BY city, employee_id LIMIT 3 seleciona David, Grace e Ana. O identificador único resolve o ponto de corte.

Para manter todos os empatados no último valor de ordenação, PostgreSQL 13 ou posterior e Oracle oferecem suporte a FETCH FIRST 3 ROWS WITH TIES. Com ORDER BY city, ele mantém seis linhas: as duas de Boston e as quatro de Chicago. Se ORDER BY também incluir um identificador único, as linhas não poderão empatar na chave de ordenação completa.

Reconheça a sintaxe do banco de dados
Banco de dadosUm limite de três linhas
SQLite, PostgreSQL, MySQLORDER BY salary DESC LIMIT 3
PostgreSQL, Oracle 12c ou posteriorORDER BY salary DESC FETCH FIRST 3 ROWS ONLY
SQL ServerSELECT TOP (3) first_name, salary FROM employees ORDER BY salary DESC;

A SQL padrão usa OFFSET e FETCH, não LIMIT. PostgreSQL e Oracle aceitam OFFSET 3 ROWS FETCH FIRST 3 ROWS ONLY. O SQL Server usa ORDER BY salary DESC OFFSET 3 ROWS FETCH NEXT 3 ROWS ONLY; ORDER BY é obrigatório para essa forma de paginação.

SQLite e MySQL também aceitam LIMIT 6, 3, com o deslocamento primeiro. Prefira LIMIT 3 OFFSET 6 para que os papéis fiquem explícitos. A paginação executa novamente uma consulta para cada página. Uma ordenação total mantém as páginas consistentes enquanto os dados permanecem inalterados; inserções ou exclusões entre solicitações ainda podem fazer as páginas repetirem ou pularem registros.

Principais conclusões

  • ORDER BY determina quais linhas vêm primeiro; LIMIT mantém no máximo a quantidade solicitada.
  • OFFSET pula linhas antes de LIMIT contar; a primeira página usa deslocamento zero.
  • Selecione DISTINCT primeiro ao classificar valores distintos em vez de linhas individuais.
  • Um critério de desempate único determina um ponto de corte; WITH TIES pode incluir linhas adicionais empatadas na chave de ordenação completa.
  • LIMIT, TOP e OFFSET/FETCH são formas de limitar linhas específicas de cada banco de dados.
  • Dados alterados podem deslocar os limites das páginas entre solicitações.
6

Construa e verifique uma consulta completa

Uma pergunta do ambiente de trabalho geralmente combina várias escolhas: quais registros contam, quais detalhes mostrar e quais linhas vêm primeiro. Planejar essas escolhas separadamente ajuda você a escrever uma consulta cujas partes são coerentes entre si. A ordem escrita das cláusulas e a ordem lógica explicam por que um filtro pode usar uma coluna oculta e por que um limite se aplica às linhas que atendem à condição. Você também verificará limites, dados ausentes e empates antes de confiar em um resultado que parece plausível.

6.1 Ordem escrita e processamento lógico

As cláusulas SQL têm uma ordem fixa de escrita. Sua ordem lógica explica o resultado como uma sequência de decisões, mesmo quando o banco de dados usa um plano de execução interno diferente.

Escreva a instrução na ordem das cláusulas
SELECT DISTINCT city
FROM employees
WHERE department = 'Sales'
ORDER BY city
LIMIT 2 OFFSET 0;

SELECT e FROM identificam as colunas solicitadas e a tabela de origem. As outras cláusulas são opcionais, mas, quando presentes, mantêm esta ordem: WHERE, ORDER BY, LIMIT e depois OFFSET nessa forma com LIMIT. DISTINCT fica imediatamente após SELECT.

Use uma cláusula WHERE com várias condições unidas. Um segundo WHERE é um erro de sintaxe. O mesmo vale para ORDER BY: coloque várias colunas de ordenação em uma cláusula, separadas por vírgulas. Mover WHERE para depois de ORDER BY não solicita uma ordem de processamento diferente; produz SQL inválida.

Acompanhe as decisões lógicas
Etapa lógicaO que acontece no exemplo
FROMLê as linhas de funcionários.
WHEREMantém Ana, Chloe e Emma em Sales.
SELECTMantém seus valores de cidade: Chicago, Chicago, Denver.
DISTINCTReduz esses valores a Chicago e Denver.
ORDER BYColoca Chicago antes de Denver.
OFFSET e LIMITNão pula nenhuma linha e retorna no máximo duas.

O resultado é Chicago, depois Denver. A cidade repetida desaparece antes de o limite contar as linhas de resultado. Você não está selecionando dois funcionários para depois perguntar se moram em cidades diferentes.

O otimizador pode usar um plano de execução física diferente que produza o mesmo resultado dessa sequência lógica.

Use colunas onde estão disponíveis

WHERE testa as linhas de origem antes de SELECT escolher as colunas exibidas:

SELECT first_name
FROM employees
WHERE salary > 60000;

Isso funciona sem salary na saída. Os nomes que atendem à condição são Ben, Emma e Farid. Salary ainda é uma coluna de cada linha de origem quando o teste é feito.

Da mesma forma, filtrar antes de limitar é essencial para obter o primeiro resultado dentro de um grupo:

SELECT first_name
FROM employees
WHERE department = 'Sales'
ORDER BY salary DESC
LIMIT 1;

A resposta é Emma. Os funcionários de Sales são selecionados primeiro; seus salários são então classificados. Selecionar primeiro a pessoa com o maior salário da empresa e testar essa única linha para Sales deixaria de fora a resposta pretendida, pois Farid pertence a IT.

Torne a estrutura visível

Escreva uma cláusula por linha e coloque condições mais longas em linhas separadas e recuadas. Para “produtos de Furniture abaixo de 200 dólares, com o maior preço primeiro”, use:

SELECT name, price
FROM products
WHERE category = 'Furniture'
  AND price < 200
ORDER BY price DESC;

Office Chair, com preço de 149,00, vem antes de Bookshelf, com 120,00. As duas condições compartilham um WHERE, o limite numérico não tem símbolo de moeda e ORDER BY ordena as linhas que passaram. Verificar cada linha de acordo com sua função facilita a localização de erros de sintaxe e de interpretações incorretas.

Principais conclusões

  • Escreva SELECT, FROM, WHERE, ORDER BY e LIMIT na ordem exigida para as cláusulas.
  • Na ordem lógica, leia a tabela, filtre, selecione colunas, remova duplicatas, ordene e depois recorte as linhas.
  • WHERE pode testar colunas de origem que SELECT não exibe.
  • Filtrar antes de classificar encontra o primeiro resultado dentro do grupo solicitado.

6.2 De uma solicitação a uma resposta verificada

Antes de escrever SQL, identifique as decisões separadas que estão implícitas em uma solicitação cotidiana. Cada decisão pertence a uma cláusula, e cada cláusula pode ser verificada em relação à resposta pretendida.

Tome seis decisões
  1. Qual tabela contém os registros? Escolha FROM.
  2. Quais registros atendem à condição? Construa WHERE.
  3. Quais campos respondem à pergunta? Escolha SELECT.
  4. Valores repetidos no resultado são úteis? Decida sobre DISTINCT.
  5. O que deve vir primeiro? Construa ORDER BY.
  6. Há um máximo ou uma página? Adicione LIMIT e OFFSET.

Para “pelo menos”, inclua a igualdade. “Um de” sugere IN, “contém” sugere um padrão LIKE com sinais de porcentagem nas duas extremidades, “ausente” sugere IS NULL e “valores distintos” sugere DISTINCT. Uma solicitação dos primeiros n resultados precisa de uma direção de ordenação e de um limite.

Crie uma lista curta de funcionários

“Mostre os nomes e as datas de contratação dos três funcionários contratados mais recentemente fora de Sales que têm telefone registrado, começando pelo mais recente.” Inclua funcionários sem departamento atribuído no significado de fora de Sales dessa solicitação.

Comece com employees. A regra de departamento para selecionar as linhas é department <> 'Sales' OR department IS NULL. Agrupe essa escolha para que a regra de telefone se aplique a ambos os ramos. Mostre nomes e datas e depois classifique as linhas que atendem às condições:

SELECT first_name, last_name, hire_date
FROM employees
WHERE (department <> 'Sales' OR department IS NULL)
  AND phone IS NOT NULL
ORDER BY hire_date DESC
LIMIT 3;

Grace Okafor em 2024-02-19 é a primeira, David Kim em 2020-11-23 é o segundo e Farid Haddad em 2017-09-12 é o terceiro. Remover o ramo IS NULL exclui Grace e deixa apenas dois resultados. Para uma solicitação pouco clara, decida como os departamentos ausentes devem contar e informe a escolha junto com a resposta.

Combine categoria, preço e estoque

“Quais produtos de Lighting ou Storage custam menos de 20 dólares e estão em estoque, começando pelos mais baratos?” Use IN para as duas opções de categoria e exija uma quantidade positiva conhecida:

SELECT name, price
FROM products
WHERE category IN ('Lighting', 'Storage')
  AND price < 20
  AND stock > 0
ORDER BY price;

Paper Tray, a 9,99, vem antes de Desk Organizer, a 18,75. Lamp Shade é barato o suficiente e pertence a uma categoria escolhida, mas seu estoque é zero, então não passa no último teste. Uma quantidade ausente de estoque também não passaria, pois não permite determinar que o estoque é positivo.

Verifique as linhas que podem revelar um erro

Comece com SELECT * FROM products LIMIT 5; ao explorar o esquema e alguns registros. Adicione filtros um por vez, verificando mudanças na contagem de resultados e exibindo temporariamente as colunas testadas quando for útil.

Teste limites exatos, valores ausentes, uso de maiúsculas e minúsculas no texto e empates no limite. NOT mostra linhas em que uma condição era falsa; ele não revela linhas em que a condição era desconhecida. Execute testes IS NULL separadamente. Verifique se a saída tem as colunas solicitadas e se ORDER BY resolve todos os empates que afetam a resposta.

Ao transferir a consulta para outro banco de dados, verifique a sintaxe de limite de linhas, as regras de maiúsculas e minúsculas para igualdade e LIKE, as aspas em identificadores, o tratamento de datas e a posição de NULL. Os exemplos usam LIMIT no SQLite e no PostgreSQL; a forma da SQL padrão para limite de linhas é OFFSET com FETCH FIRST.

Principais conclusões

  • Planeje separadamente a tabela, as linhas que atendem às condições, as colunas de saída, as duplicatas, a ordenação e a quantidade de linhas.
  • Escreva explicitamente a escolha sobre valores ausentes quando uma exclusão deve incluir registros sem atribuição.
  • Verifique os limites e os efeitos de cada filtro em relação à pergunta.
  • Examine valores NULL separadamente, pois NOT não transforma desconhecido em verdadeiro.
  • Verifique novamente maiúsculas e minúsculas, datas, nomes, ordenação de NULL e limites de linhas ao mudar de banco de dados.

Exercícios resolvidos de Consultas com SELECT

6 Lições Interativas

1

De registros de funcionários a uma lista de cidades

11 passos
Escolha as colunas do resultado e depois decida o que deve contar como duplicata.
  1. 1
    IntroduçãoUma tabela, dois tipos de resposta

    Uma lista de funcionários e uma lista das cidades dos funcionários usam os mesmos registros, mas precisam de resultados com estruturas diferentes. Um SELECT básico escolhe os campos a exibir. DISTINCT pode então reduzir valores selecionados repetidos. Primeiro construiremos um resultado de funcionários com duas colunas, depois mudaremos a pergunta para cidades distintas e acompanharemos o que desaparece.

  2. 2
    ExplicaçãoEscolha as colunas exibidas

    Comece com uma solicitação específica: mostre a cidade de cada funcionário seguida de seu nome. Escreva:

    SELECT city, first_name
    FROM employees;
    

    A lista SELECT define a ordem das colunas de saída, então a cidade vem primeiro. FROM fornece a tabela. Não há filtro, então todos os oito funcionários contribuem com uma linha; essa consulta simples mantém os registros armazenados inalterados.

  3. 3
    ExemploLeia a estrutura do resultado

    O registro de Ana contribui com Chicago e Ana; o de Ben contribui com Denver e Ben. Cada funcionário restante contribui com os mesmos dois campos. O resultado, portanto, tem oito linhas e duas colunas. Cidades repetidas permanecem porque essas linhas ainda descrevem pessoas diferentes. Não há ORDER BY, então esses exemplos identificam as linhas sem garantir sua ordem de exibição.

  4. 4
    DesafioVerifique uma lista SELECT alterada

    O que muda se a consulta se tornar SELECT first_name FROM employees;? Informe a quantidade de linhas e de colunas.

    ---reveal---

    Ela ainda retorna oito linhas, agora com uma coluna, first_name. Remover city de SELECT remove um campo exibido, não registros de funcionários. Seria necessário um filtro ou limite de linhas para reduzir as linhas.

  5. 5
    DicaLocalize os erros de sintaxe

    Separe os nomes das colunas com vírgulas, mas não coloque vírgula depois do último antes de FROM. Use ponto e vírgula para encerrar a instrução; -- inicia um comentário que vai até o fim da linha. Se o banco de dados informar uma coluna desconhecida, compare a grafia com o esquema. SELECT * é útil para uma primeira análise, enquanto nomes explícitos mantêm um resultado salvo focado.

  6. 6
    ExplicaçãoPeça cidades distintas

    Agora pergunte quais cidades têm funcionários. Os nomes não pertencem mais a essa resposta:

    SELECT DISTINCT city
    FROM employees;
    

    As oito entradas de cidade são reduzidas a Chicago, Denver e Boston, sem ordem garantida. DISTINCT remove repetições do resultado selecionado, não da tabela de funcionários armazenada. Cada cidade aparece uma vez, mesmo que várias pessoas morem nela.

  7. 7
    ExemploCompare linhas selecionadas completas

    Adicione departamento à lista SELECT. Ana e Chloe contribuem com o par Sales-Chicago, que é reduzido a uma linha. Emma contribui com Sales-Denver, que permanece porque a cidade é diferente. O resultado completo de SELECT DISTINCT department, city FROM employees; tem sete linhas. DISTINCT é escrito uma vez após SELECT e compara todos os campos selecionados em conjunto.

  8. 8
    DesafioUm identificador único altera a remoção de duplicatas

    Quantas linhas SELECT DISTINCT employee_id, city FROM employees; retornaria e por quê?

    ---reveal---

    Todas as oito linhas permanecem. Cada employee_id é único, então cada par de identificador e cidade difere de todos os outros. Cidades repetidas, por si só, não bastam para tornar duplicadas as linhas selecionadas completas.

  9. 9
    Ideia-chaveDecida o que uma linha NULL informa

    Uma lista DISTINCT de departamentos contém Sales, IT, Marketing e uma linha NULL para Grace. Marcadores de ausência repetidos também seriam reduzidos a um só. Essa linha informa que um departamento não está registrado; ela não é outro departamento nomeado. O agrupamento de duplicatas reúne valores NULL, embora uma comparação comum NULL = NULL seja desconhecida.

  10. 10
    DesafioTermine com uma lista curta ordenada

    Preveja SELECT DISTINCT city FROM employees ORDER BY city LIMIT 2;. Informe os valores na ordem em que são retornados e explique o que o limite conta.

    ---reveal---

    Boston, depois Chicago. DISTINCT primeiro reduz os valores de cidade a três; ORDER BY ordena esses valores e LIMIT mantém dois. Ele conta cidades distintas no resultado após a remoção de duplicatas, não dois registros de funcionários.

  11. 11
    RecapitulaçãoAjuste a saída à pergunta

    Um resultado de funcionários mantém campos de identificação; uma lista de cidades seleciona apenas a cidade com DISTINCT. As colunas selecionadas determinam as comparações de duplicatas, enquanto ORDER BY determina a ordem das linhas. Ao alterar uma consulta, verifique tanto os campos de saída quanto o que uma linha de resultado representa.

2

Construa um filtro que expresse sua intenção

13 passos
Transforme limites, valores entre aspas e grupos de condições em testes de linhas.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoTodo filtro faz uma pergunta precisa
  2. 2
    ExplicaçãoInterprete o limite salarial
  3. 3
    DesafioInclua o limite quando necessário
  4. 4
    DicaEscreva literais numéricos sem adornos
  5. 5
    ExplicaçãoColoque um valor de texto entre aspas
  6. 6
    ExemploMantenha um apóstrofo dentro do valor
  7. 7
    ExplicaçãoUse um limite de data completo
  8. 8
    DesafioVerifique uma data com hora
  9. 9
    ExplicaçãoUna as condições
  10. 10
    ExemploAplique uma regra de cidade às alternativas
  11. 11
    DesafioInverta o grupo
  12. 12
    DesafioCombine uma data e um grupo de departamentos
  13. 13
    RecapitulaçãoAcompanhe uma linha reveladora
3

Escolha uma lista exata, um intervalo ou um padrão

15 passos
Use a forma de correspondência adequada à pergunta e verifique seus limites.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoTrês significados de correspondência
  2. 2
    ExplicaçãoComece com opções de categoria completas
  3. 3
    ExemploAplique uma regra de estoque à lista
  4. 4
    DesafioPreveja uma exclusão
  5. 5
    ExplicaçãoColoque um preço dentro de um intervalo
  6. 6
    DesafioExclua os extremos deliberadamente
  7. 7
    DicaCubra um mês inteiro com horas
  8. 8
    ExplicaçãoDecida onde o fragmento deve aparecer
  9. 9
    ExemploConte um caractere com um sublinhado
  10. 10
    ExemploTorne o caractere curinga literal
  11. 11
    DesafioVerifique um padrão em suas extremidades
  12. 12
    ConexãoVerifique o tratamento de maiúsculas e minúsculas no banco de dados
  13. 13
    DesafioConsidere um telefone ausente
  14. 14
    DesafioCombine os três tipos de correspondência
  15. 15
    RecapitulaçãoEscolha a forma pelo significado
4

Encontre dados ausentes e raciocine sobre eles

10 passos
Distinga NULL de valores conhecidos e acompanhe o valor desconhecido em um filtro.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoUma quantidade não registrada fica sem resolução
  2. 2
    ExemploSepare zero de ausência
  3. 3
    ExplicaçãoTeste a presença diretamente
  4. 4
    DesafioVerifique texto vazio
  5. 5
    ExplicaçãoAcompanhe uma comparação e seu oposto
  6. 6
    ExemploDeixe um ramo OR verdadeiro decidir
  7. 7
    DesafioUm ramo AND falso pode decidir o resultado
  8. 8
    Ideia-chaveEvite NULL dentro de uma lista de exclusão
  9. 9
    DesafioInclua departamentos ausentes e exija telefones
  10. 10
    RecapitulaçãoExamine dados ausentes separadamente
5

Construa uma página ordenada e reproduzível

15 passos
Classifique as linhas que atendem às condições, resolva empates e aplique um limite e um deslocamento.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoUma página é um recorte de uma resposta ordenada
  2. 2
    ExemploEscolha o maior primeiro
  3. 3
    DesafioOrdene apenas os produtos que atendem à condição
  4. 4
    DicaSaiba se a ordenação é numérica
  5. 5
    ExplicaçãoLeia as prioridades de ordenação a partir da esquerda
  6. 6
    DesafioDefina a direção de cada coluna de ordenação
  7. 7
    ExplicaçãoResolva os empates restantes
  8. 8
    ConexãoPosicione valores ausentes explicitamente
  9. 9
    ExemploMantenha as três primeiras linhas classificadas
  10. 10
    ExemploPasse da primeira página
  11. 11
    Ideia-chaveA posição de uma linha difere da posição de um valor distinto
  12. 12
    DesafioExamine um ponto de corte com empate
  13. 13
    DicaReconheça outra forma de limitar linhas
  14. 14
    DesafioMantenha a segunda página de cidades
  15. 15
    RecapitulaçãoDefina a classificação antes do recorte
6

Transforme e verifique uma solicitação de trabalho

12 passos
Construa uma consulta completa a uma única tabela e verifique como cada cláusula altera a resposta.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoSepare as decisões de uma solicitação
  2. 2
    ExplicaçãoEscreva as cláusulas em uma ordem válida
  3. 3
    ExemploAcompanhe o modelo lógico
  4. 4
    DesafioFiltre antes de escolher o primeiro colocado
  5. 5
    ExplicaçãoIdentifique a solicitação sobre funcionários
  6. 6
    ExemploTorne explícita a regra de departamento
  7. 7
    ExemploAplique a exigência de telefone
  8. 8
    ExemploClassifique os registros que atendem às condições
  9. 9
    DesafioVerifique a decisão sobre valores ausentes
  10. 10
    DesafioConecte as cláusulas em uma sequência
  11. 11
    DicaEscolha verificações que revelem erros
  12. 12
    RecapitulaçãoConfira a resposta em relação à solicitação

Questões de Consultas com SELECT

50 Questões de Prática em 5 conjuntos

Conjunto 1: Listas, intervalos e padrões de caracteres10 Questões de Prática

Questão 1 de 10

Uma coluna numérica fee tem os valores 12, 18, 24 e 30. Quais valores passam em WHERE fee BETWEEN 18 AND 30?
  1. Apenas 24
  2. 18, 24
  3. 18, 24, 30
  4. 12, 18, 24
Mostrar respostaOcultar resposta
Resposta: C
BETWEEN inclui ambos os extremos de seu intervalo, então 18 e 30 passam junto com 24. Manter apenas o valor do meio trataria ambos os extremos como excluídos. O valor inferior 12 não passa porque está abaixo de 18, independentemente de sua posição na tabela.

Questão 2 de 10

Qual padrão LIKE seleciona texto que termina com report?
  1. '%report'
  2. 'report%'
  3. '%report%'
  4. '_report'
Mostrar respostaOcultar resposta
Resposta: A
Um sinal de porcentagem no início permite qualquer prefixo, e nada vem depois de report no padrão, então o valor inteiro deve terminar ali. Colocar sinais de porcentagem nos dois lados também permitiria um sufixo e incluiria valores em que report aparece no meio. Um sublinhado permite apenas um caractere de prefixo.

Questão 3 de 10

Uma tabela requests tem as linhas (request_id, region) (31, 'South'), (32, 'East'), (33, 'South'). Qual conjunto de identificadores passa em WHERE region IN ('South', 'South')?
  1. {31, 31, 33, 33}
  2. {31}
  3. {31, 32, 33}
  4. {31, 33}
Mostrar respostaOcultar resposta
Resposta: D
Cada linha é testada uma vez quanto à presença entre os valores permitidos, então os dois registros South passam uma vez cada. Repetir South na lista não duplica essas linhas de resultado. A lista também não determina a ordem do resultado, então a resposta é um conjunto de identificadores.

Questão 4 de 10

Em uma tabela labels, qual conjunto de valores corresponde a label LIKE '__7%': 'AB7', 'A7', 'AB70' e 'ABC7'?
  1. {AB7, A7, AB70}
  2. {AB7, AB70}
  3. {AB70, ABC7}
  4. {A7, AB7}
Mostrar respostaOcultar resposta
Resposta: B
Os dois sublinhados exigem exatamente dois caracteres antes do 7 literal. O sinal de porcentagem final aceita zero caracteres em AB7 e um em AB70. ABC7 não passa porque seu terceiro caractere é C, enquanto A7 tem apenas um caractere antes de 7.

Questão 5 de 10

Uma coluna numérica temperature contém 4, 9, 14, 19 e NULL. Quais valores passam em WHERE temperature NOT BETWEEN 9 AND 14?
  1. 4, 19
  2. 4, 9, 14, 19
  3. 4, 19, NULL
  4. 9, 14
Mostrar respostaOcultar resposta
Resposta: A
NOT BETWEEN mantém valores abaixo de 9 ou acima de 14, então 4 e 19 passam. Os extremos 9 e 14 estão dentro do intervalo original inclusivo e são excluídos aqui. NULL não passa em nenhuma das formas porque a comparação é desconhecida; a negação não a torna verdadeira.

Questão 6 de 10

Uma coluna promo_code contém 'VIP_2', 'VIPA2', 'VIP_' e 'VIP2'. Qual conjunto corresponde a WHERE promo_code LIKE 'VIP!_%' ESCAPE '!'?
  1. {VIP_2, VIPA2, VIP_}
  2. {VIP_2}
  3. {VIP_2, VIP_}
  4. {VIPA2, VIP2}
Mostrar respostaOcultar resposta
Resposta: C
O escape torna !_ um sublinhado literal após VIP, e o sinal de porcentagem final pode corresponder a zero ou mais caracteres. VIP_2 e VIP_ correspondem, portanto. VIPA2 corresponderia a um padrão com sublinhado sem escape, mas não tem o sublinhado real exigido por este padrão.

Questão 7 de 10

Uma tabela appointments armazena texto com hora no formato de largura fixa YYYY-MM-DD HH:MM:SS. Qual condição seleciona todos os compromissos de fevereiro de 2028?
  1. starts_at BETWEEN '2028-02-01' AND '2028-02-29'
  2. starts_at >= '2028-02-01' AND starts_at < '2028-03-01'
  3. starts_at > '2028-02-01' AND starts_at > '2028-03-01'
  4. starts_at >= '2028-02-01' AND starts_at <= '2028-03-01'
Mostrar respostaOcultar resposta
Resposta: B
O limite inferior inclui o início de fevereiro e o limite superior estrito termina antes do início de março. Um extremo superior de 29 de fevereiro que contém apenas a data é ordenado antes de texto com hora nessa data, então BETWEEN deixaria de fora os compromissos do último dia. O limite do mês seguinte evita esse problema.

Questão 8 de 10

Segundo o comportamento padrão de LIKE no SQLite, qual conjunto corresponde a word LIKE 'map%' entre 'Maple', 'map', 'roadmap' e 'MAPS'?
  1. {map}
  2. {map, roadmap}
  3. {Maple, map}
  4. {Maple, map, MAPS}
Mostrar respostaOcultar resposta
Resposta: D
O LIKE padrão do SQLite ignora maiúsculas e minúsculas nas letras ASCII, então os três valores que começam com map correspondem. O sinal de porcentagem pode representar nenhum caractere, o que inclui o próprio map. Roadmap não passa porque o padrão não tem caractere curinga no início para permitir caracteres antes de map.

Questão 9 de 10

Uma tabela members tem as linhas (member_id, tier) (41, 'Gold'), (42, 'Silver'), (43, NULL). Qual conjunto de identificadores passa em WHERE tier IN ('Silver', NULL)?
  1. {}
  2. {42, 43}
  3. {41, 42}
  4. {42}
Mostrar respostaOcultar resposta
Resposta: D
Silver tem uma entrada correspondente real na lista, então o membro 42 passa. Uma categoria ausente não é igual à entrada NULL da lista; essa comparação é desconhecida, então o membro 43 é excluído. IN com uma entrada NULL pode manter correspondências conhecidas, ao contrário de NOT IN, que não consegue estabelecer todas as desigualdades exigidas.

Questão 10 de 10

Uma tabela shipments registra um port por linha. Qual condição exclui tanto Oakland quanto Tacoma quando todos os valores de port estão registrados?
  1. NOT (port = 'Oakland' OR port = 'Tacoma')
  2. NOT port = 'Oakland' OR port = 'Tacoma'
  3. port <> 'Oakland' OR port <> 'Tacoma'
  4. NOT (port <> 'Oakland' AND port <> 'Tacoma')
Mostrar respostaOcultar resposta
Resposta: A
O OR agrupado identifica qualquer um dos portos indesejados, e NOT inverte esse grupo completo. Unir as duas desigualdades com OR incluiria todos os portos registrados, pois cada um difere de pelo menos um dos portos indicados. A exclusão pretendida exige que ambas as desigualdades sejam atendidas.
Conjunto 2: Valores ausentes e filtros combinados10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Uma tabela jobs contém as linhas (job_id, hours, urgent) (51, NULL, 'yes'), (52, 6, 'no'), (53, 2, 'yes'), (54, NULL, 'no'). Qual conjunto passa em WHERE NOT (hours > 4) OR urgent = 'yes'?
  1. {51, 53}
  2. {53}
  3. {51, 53, 54}
  4. {51, 52, 53}
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Uma tabela files tem os valores de folder 'Archive', 'Active' e NULL. Qual condição inclui Active e a pasta ausente, excluindo Archive?
  1. folder <> 'Archive'
  2. folder <> 'Archive' OR folder IS NULL
  3. folder <> 'Archive' AND folder IS NULL
  4. folder NOT IN ('Archive', NULL)
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Uma tabela routes tem as linhas (route_id, depot) (61, 'A'), (62, 'B'), (63, NULL). Qual conjunto de identificadores passa em WHERE depot NOT IN ('A', NULL) OR depot IS NULL?
  1. {62, 63}
  2. {}
  3. {61, 62, 63}
  4. {63}
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Uma tabela contacts do SQLite armazena os valores de phone NULL, '', 'NULL' e '555-0188'. Quantas linhas passam em WHERE phone IS NULL?
  1. 2 linhas
  2. 3 linhas
  3. 4 linhas
  4. 1 linha
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Uma linha de devices tem battery_pct = NULL e status = 'ready'. O que acontece com WHERE battery_pct > 50 OR status = 'ready'?
  1. Ela é excluída porque qualquer NULL torna OR desconhecido.
  2. Ela é mantida porque o ramo de status é verdadeiro.
  3. Ela é excluída porque ambos os ramos devem ser verdadeiros.
  4. Ela é mantida porque OR sempre ignora ramos NULL.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Qual condição encontra linhas com um valor de email registrado, incluindo texto vazio se ele estiver armazenado como valor no PostgreSQL?
  1. email <> NULL
  2. email <> ''
  3. email IS NOT NULL
  4. email = 'NULL'
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Uma tabela tem cinco valores numéricos de load: 0, 3, 7, NULL, NULL. Duas consultas usam WHERE load > 3 e WHERE NOT (load > 3). Quais são suas quantidades de linhas, nessa ordem?
  1. 1 e 2
  2. 3 e 2
  3. 1 e 4
  4. 2 e 3
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Uma tabela deliveries tem os valores de district 'Hill', NULL, 'Hill', NULL e 'Lake'. Quantas linhas SELECT DISTINCT district FROM deliveries; retorna?
  1. 4 linhas
  2. 2 linhas
  3. 3 linhas
  4. 5 linhas
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Um relatório usa WHERE rating >= 4 e depois verifica as linhas excluídas com WHERE NOT (rating >= 4). Alguns registros não aparecem em nenhum dos resultados. Qual teste adicional revela registros cuja avaliação não foi registrada?
  1. WHERE rating < 4
  2. WHERE rating = NULL
  3. WHERE rating IS NULL
  4. WHERE rating <> 4
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Uma tabela messages tem os assuntos 'Note A', 'Alert', NULL e 'Note B'. Quantas linhas passam em WHERE subject NOT LIKE 'Note%'?
  1. 2 linhas
  2. 4 linhas
  3. 3 linhas
  4. 1 linha
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 3: Colunas, comparações e condições claras10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Uma tabela parcels armazena weight_kg numérico. Qual condição mantém encomendas que pesam no máximo 8 quilogramas?
  1. weight_kg < 8
  2. weight_kg >= 8
  3. weight_kg > 8
  4. weight_kg <= 8
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Qual condição SQL corresponde ao valor de texto exato D'Arcy em uma coluna surname?
  1. surname = 'D''Arcy'
  2. surname = 'D'Arcy'
  3. surname = "D'Arcy"
  4. surname = D'Arcy
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Uma tabela tickets tem status e priority numérica. Qual condição seleciona chamados abertos ou pendentes, cada um com prioridade de pelo menos 4?
  1. status = 'open' OR status = 'pending' AND priority >= 4
  2. (status = 'open' AND status = 'pending') OR priority >= 4
  3. (status = 'open' OR status = 'pending') AND priority >= 4
  4. (status = 'open' OR status = 'pending') AND priority > 4
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Uma tabela visits contém os pares (site, day) ('East', 'Mon'), ('East', 'Mon'), ('East', 'Tue') e ('West', 'Mon'). Quantas linhas SELECT DISTINCT site, day FROM visits; retorna?
  1. 2 linhas
  2. 3 linhas
  3. 4 linhas
  4. 1 linha
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Uma linha tem team = 'Blue', city = 'Austin' e score = 62. Ela passa em WHERE team = 'Blue' OR city = 'Miami' AND score >= 80? Por quê?
  1. Sim; o teste verdadeiro da equipe basta para OR.
  2. Não; o teste de pontuação se aplica aos dois locais.
  3. Sim; OR exige que as duas comparações de texto sejam verdadeiras.
  4. Não; o teste de cidade é falso e deve sempre passar.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma tabela rooms tem 12 linhas. Qual é a estrutura do resultado de SELECT floor, room_name FROM rooms;?
  1. 2 linhas e 12 colunas
  2. 12 linhas e 2 colunas
  3. 12 linhas e todas as colunas
  4. 2 linhas e todas as colunas
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Uma coluna de texto armazena datas completas como YYYY-MM-DD. Qual condição seleciona datas após o ano-calendário de 2025?
  1. event_date > '2025'
  2. event_date > '2025-01-01'
  3. event_date >= '2025-12-31'
  4. event_date >= '2026-01-01'
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Qual condição seleciona registros cujo valor inteiro de zone é North ou West?
  1. zone IN 'North', 'West'
  2. zone IN ('North, West')
  3. zone IN ('North', 'West')
  4. zone = 'North' AND zone = 'West'
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Uma tabela loans tem os valores numéricos de days_late 0, 2, 5 e NULL. Quantas linhas passam em WHERE days_late <> 0?
  1. 4 linhas
  2. 2 linhas
  3. 3 linhas
  4. 1 linha
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Uma tabela stockrooms tem as linhas (room_id, building) (1, 'C'), (2, 'A'), (3, 'A'), (4, 'B'), (5, 'C'). Quais valores ordenados resultam de SELECT DISTINCT building FROM stockrooms ORDER BY building DESC LIMIT 2;?
  1. C, C
  2. A, B
  3. B, A
  4. C, B
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 4: Classificação, empates e páginas posteriores10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Uma coluna numérica duration_minutes tem os valores 16, 4 e 23. Qual é sua ordem em ORDER BY duration_minutes?
  1. 23, 16, 4
  2. 16, 23, 4
  3. 4, 16, 23
  4. 16, 4, 23
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Uma tabela racers tem as linhas (racer_id, group_name, points) (71, 'A', 8), (72, 'B', 12), (73, 'A', 15). Qual ordem de identificadores resulta de ORDER BY group_name, points DESC?
  1. 73, 71, 72
  2. 73, 72, 71
  3. 72, 73, 71
  4. 71, 73, 72
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Um resultado ordenado fixo contém 23 linhas. Quais LIMIT e OFFSET retornam a página 3 com 6 linhas por página?
  1. LIMIT 6 OFFSET 3
  2. LIMIT 6 OFFSET 18
  3. LIMIT 3 OFFSET 6
  4. LIMIT 6 OFFSET 12
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Uma tabela fixa orders tem valores únicos de order_id, e várias linhas compartilham tanto order_date quanto total. Qual ORDER BY coloca as datas mais recentes primeiro, os maiores totais dentro de cada data e fornece uma ordenação total?
  1. ORDER BY order_date DESC, total DESC
  2. ORDER BY order_date DESC, total DESC, order_id
  3. ORDER BY order_id, order_date DESC, total DESC
  4. ORDER BY order_date, total DESC, order_id DESC
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Uma tabela offers tem as linhas (offer_id, rate) (81, 40), (82, 40), (83, 35), (84, 30). Qual taxa resulta de SELECT DISTINCT rate FROM offers ORDER BY rate DESC LIMIT 1 OFFSET 1;?
  1. 40
  2. 35
  3. 30
  4. Nenhuma taxa
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma tabela queues contém os nomes 'Delta', NULL e 'Alpha'. No ORDER BY queue_name ASC padrão, onde fica a linha NULL no SQLite e no PostgreSQL?
  1. Primeiro no SQLite; primeiro no PostgreSQL.
  2. Último no SQLite; primeiro no PostgreSQL.
  3. Primeiro no SQLite; último no PostgreSQL.
  4. Último no SQLite; último no PostgreSQL.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Uma tabela sales tem as linhas (sale_id, amount) (91, 70), (92, 70), (93, 55), (94, 55), (95, 20). No PostgreSQL, quantas linhas SELECT sale_id, amount FROM sales ORDER BY amount DESC FETCH FIRST 3 ROWS WITH TIES; retorna?
  1. 4 linhas
  2. 2 linhas
  3. 5 linhas
  4. 3 linhas
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Uma coluna de texto do SQLite armazena os valores '6', '12' e '100' com colação binária. Qual é sua ordem crescente?
  1. 6, 12, 100
  2. 100, 6, 12
  3. 12, 100, 6
  4. 100, 12, 6
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Uma consulta de página usa ORDER BY item_id LIMIT 4 OFFSET 4 em linhas inalteradas com identificadores únicos de 1 a 12. Antes da consulta da página seguinte, a linha 2 é excluída. Quais identificadores LIMIT 4 OFFSET 8 retorna agora com a mesma ordenação?
  1. 9, 10, 11, 12
  2. 8, 9, 10, 11
  3. 10, 11, 12
  4. 9, 10, 11
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Uma tabela tasks tem as linhas (task_id, owner, hours) (101, 'Lee', 9), (102, 'Ari', 8), (103, 'Lee', 5), (104, 'Lee', 3). Qual identificador resulta de SELECT task_id FROM tasks WHERE owner = 'Lee' ORDER BY hours DESC LIMIT 1 OFFSET 1;?
  1. 103
  2. 102
  3. 101
  4. 104
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 5: Consultas completas e verificações de resultado10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Qual é a ordem escrita das cláusulas para uma consulta a uma tabela com filtro, ordenação e limite de linhas?
  1. SELECT, FROM, ORDER BY, WHERE, LIMIT
  2. FROM, SELECT, WHERE, ORDER BY, LIMIT
  3. SELECT, FROM, WHERE, LIMIT, ORDER BY
  4. SELECT, FROM, WHERE, ORDER BY, LIMIT
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Uma tabela courses tem title, fee numérica e places_left numérica. Qual consulta mostra os títulos e preços de cursos abaixo de 75 dólares com vagas disponíveis, começando pelos mais baratos?
  1. SELECT title, fee FROM courses WHERE fee < 75 AND places_left > 0 ORDER BY fee;
  2. SELECT title, fee FROM courses WHERE fee <= 75 AND places_left > 0 ORDER BY fee;
  3. SELECT title, fee FROM courses WHERE fee < 75 OR places_left > 0 ORDER BY fee;
  4. SELECT title, fee FROM courses WHERE fee < 75 AND places_left > 0 ORDER BY fee DESC;
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Uma tabela cases tem as linhas (case_id, team, opened_on, phone) (111, 'Red', '2026-06-12', 'x'), (112, NULL, '2026-06-20', 'y'), (113, 'Blue', '2026-06-18', NULL), (114, 'Blue', '2026-06-10', 'z'). Quais identificadores ordenados correspondem aos dois casos mais recentes fora de Red, incluindo equipes não atribuídas, com telefone registrado?
  1. 113, 114
  2. 112, 114
  3. 112, 113
  4. Apenas 114
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Uma linha de rentals tem branch = 'East' e returned = 'yes'. Uma consulta deve mostrar locações não devolvidas de East ou West, mas essa linha aparece. O filtro é branch = 'East' OR branch = 'West' AND returned = 'no'. Qual correção aplica a regra de devolução às duas unidades?
  1. branch = 'East' AND branch = 'West' AND returned = 'no'
  2. branch = 'East' OR (branch = 'West' AND returned = 'no')
  3. (branch = 'East' OR branch = 'West') AND returned = 'no'
  4. (branch = 'East' OR branch = 'West') OR returned = 'no'
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Uma tabela catalog tem nomes de produtos em ASCII. Qual condição encontra nomes que contêm steel sem diferenciar maiúsculas de minúsculas em ASCII tanto no SQLite quanto no PostgreSQL?
  1. LOWER(name) LIKE '%steel%'
  2. name LIKE 'steel%'
  3. LOWER(name) LIKE 'steel%'
  4. name = '%steel%'
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma coluna de texto do SQLite tem os códigos 'G', 'G1', 'H2', 'J' e 'J1' com colação binária. Qual conjunto passa em WHERE code BETWEEN 'G' AND 'J' AND code NOT LIKE 'H%'?
  1. {G, H2, J}
  2. {G, G1, J, J1}
  3. {G1, J1}
  4. {G, G1, J}
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Uma tabela logs contém as linhas (region, channel) ('East', 'web'), ('East', 'web'), ('East', 'store'), ('West', 'web'), ('West', 'store'). Quais linhas ordenadas resultam de SELECT DISTINCT region, channel FROM logs WHERE channel = 'web' ORDER BY region DESC LIMIT 1;?
  1. West-web, East-web
  2. East-web
  3. West-web
  4. West-store
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

No PostgreSQL, uma tabela bids tem as linhas (bid_id, amount) (121, 90), (122, 90), (123, 80), (124, 80). Quantas linhas SELECT bid_id, amount FROM bids ORDER BY amount DESC, bid_id FETCH FIRST 3 ROWS WITH TIES; retorna?
  1. 4 linhas
  2. 3 linhas
  3. 2 linhas
  4. 1 linha
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Uma tabela sensors contém as linhas (sensor_id, reading, enabled) (131, NULL, 'yes'), (132, 8, 'yes'), (133, 2, 'no'), (134, NULL, 'no'). Qual conjunto passa em WHERE NOT (reading > 5 AND enabled = 'yes')?
  1. {131, 133, 134}
  2. {133}
  3. {131, 133}
  4. {133, 134}
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Um relatório deve incluir taxas de pelo menos 50. Seu filtro é fee > 50, e os únicos registros de teste disponíveis têm taxas 20 e 80. Qual taxa de teste adicional revela o erro mais diretamente?
  1. 49
  2. 50
  3. 51
  4. 100
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Travou em uma questão sua? Ajuda com Tarefas

Termos-Chave

61 Termos-Chave, cada um com sua definição

A

AND
AND é um operador lógico que exige que ambas as condições unidas sejam verdadeiras para que a condição completa passe por um filtro WHERE.
A condição Sales AND Chicago mantém funcionários de Sales em Chicago, mas exclui um funcionário de Sales cuja cidade registrada é Denver.
ASC
ASC especifica ordem crescente para uma coluna de ordenação, como o menor valor numérico ou a data mais antiga primeiro; é a direção padrão.
Ordenar produtos de Lighting por price ASC coloca o produto de iluminação mais barato primeiro e o mais caro por último.

B

BETWEEN
BETWEEN é um teste de intervalo que exige que um valor seja pelo menos o extremo inferior e no máximo o extremo superior, incluindo ambos.
price BETWEEN 15.50 AND 89.00 inclui produtos com preço exatamente de 15,50 ou 89,00, os dois extremos indicados.

C

Caractere curinga de porcentagem (%)
O caractere curinga de porcentagem é o caractere % dentro de um padrão LIKE, onde representa qualquer sequência de zero ou mais caracteres.
O caractere curinga de porcentagem em 'Lamp%' permite qualquer sufixo após Lamp, inclusive nenhum sufixo para o valor Lamp.
Caractere curinga de sublinhado
O caractere curinga de sublinhado é o caractere _ dentro de um padrão LIKE, onde representa exatamente um caractere naquela posição.
Quatro ocorrências do caractere curinga de sublinhado correspondem a nomes como Emma e Hugo porque cada um tem quatro caracteres.
Cláusula ESCAPE
Uma cláusula ESCAPE declara um caractere que torna literal um caractere curinga seguinte dentro de um padrão LIKE, permitindo buscar % ou _ reais.
A cláusula ESCAPE em LIKE 'SPRING!_%' ESCAPE '!' torna o sublinhado após SPRING um caractere literal.
Cláusula FROM
A cláusula FROM identifica a tabela que fornece os registros para uma consulta básica, permitindo que as colunas selecionadas sejam lidas dela.
A cláusula FROM em SELECT name, price FROM products; identifica products como a origem dos dois campos.
Cláusula SELECT
A cláusula SELECT indica as colunas a exibir no resultado de uma consulta e define a ordem em que essas colunas de saída aparecem.
A cláusula SELECT em SELECT city, first_name FROM employees; coloca a cidade antes do nome do funcionário.
Cláusula WHERE
A cláusula WHERE filtra registros de origem por uma condição e mantém apenas as linhas para as quais essa condição é avaliada como verdadeira.
A cláusula WHERE WHERE salary < 50000 mantém os funcionários que ganham menos de 50000, mesmo quando a saída oculta seus salários.
Colação
Uma colação é o conjunto de regras usado para comparar e ordenar texto, incluindo o tratamento de caracteres maiúsculos, minúsculos e acentuados.
Uma colação que diferencia maiúsculas de minúsculas distingue 'Chicago' de 'chicago', então um filtro por 'chicago' não encontra linhas armazenadas como Chicago.
Coluna de ordenação
Uma coluna de ordenação é um campo indicado em ORDER BY para determinar a ordem das linhas do resultado; ela não precisa ser exibida em uma consulta SELECT comum.
Salário pode ser a coluna de ordenação quando a saída mostra apenas first_name, produzindo uma lista classificada de nomes.
Coluna principal de ordenação
Uma coluna principal de ordenação é o primeiro campo de ORDER BY, que controla a ordem principal antes de colunas posteriores resolverem valores iguais.
Cidade é a coluna principal de ordenação em ORDER BY city, last_name, mantendo os nomes de Boston antes dos de Chicago.
Combinação de valores selecionados
Uma combinação de valores selecionados é o grupo de valores que aparecem juntos em uma linha de resultado; adicionar uma coluna pode alterar sua unicidade.
Adicionar employee_id torna diferente cada combinação de valores selecionados em um resultado de cidades porque os identificadores são únicos.
Comentário SQL
Um comentário SQL é um texto explicativo ignorado quando uma instrução é executada; dois hífens iniciam um comentário que vai até o fim da linha.
Um comentário SQL após -- pode explicar por que um filtro inclui funcionários sem departamento atribuído sem alterar suas condições.
Conjunto de resultados
Um conjunto de resultados é a tabela de linhas e colunas retornada por uma consulta; ela pode conter menos campos ou registros que sua origem.
Para uma tabela de oito funcionários, o conjunto de resultados de SELECT city FROM employees; tem oito linhas, permitindo valores de cidade repetidos.
Construção incremental de consultas
A construção incremental de consultas adiciona e verifica uma condição por vez, facilitando explicar qual exigência remove cada linha.
A construção incremental de consultas adiciona um teste de telefone após um teste de departamento para mostrar quais funcionários o teste de telefone remove.
Consulta
Uma consulta é uma solicitação de dados a um banco de dados, escrita como uma instrução que especifica quais registros ou valores devem ser retornados.
A consulta SELECT first_name FROM employees; solicita ao banco de dados o campo de nome de cada funcionário.
Critério de desempate
Um critério de desempate é uma coluna de ordenação posterior consultada quando os valores anteriores são iguais; um valor final único torna a ordem total.
Adicionar employee_id como critério de desempate após cidade determina qual de vários funcionários de Chicago ocupa o último lugar de uma lista curta.

D

DESC
DESC especifica ordem decrescente para sua coluna de ordenação, invertendo a ordem crescente para colocar números maiores ou datas mais recentes primeiro.
ORDER BY hire_date DESC coloca um funcionário contratado em 2024 antes de um contratado em 2023 na lista de funcionários.
Dialeto SQL
Um dialeto SQL é a versão da sintaxe e do comportamento da SQL de um sistema de banco de dados, incluindo diferenças em limites de linhas, comparação de texto e uso de aspas.
Quando o dialeto SQL muda de SQLite para SQL Server, uma consulta LIMIT precisa usar TOP ou OFFSET/FETCH em seu lugar.
DISTINCT
DISTINCT é um modificador de SELECT que remove linhas completas duplicadas do resultado selecionado, mantendo os registros armazenados inalterados.
Quando oito funcionários trabalham em três cidades, SELECT DISTINCT city FROM employees; lista apenas essas três cidades.

E

Extremo do intervalo
Um extremo do intervalo é um limite que define o início ou o fim de um intervalo; sua inclusão depende da comparação escolhida.
Cada preço extremo em BETWEEN 15.50 AND 89.00 está incluído, então produtos com preço exatamente de 15,50 ou 89,00 atendem à condição.

F

Formato de data ISO
O formato de data ISO YYYY-MM-DD escreve o ano antes das partes de mês e dia com largura fixa, permitindo que datas em texto sejam ordenadas cronologicamente.
Usando o formato de data ISO, hire_date >= '2023-01-01' inclui funcionários contratados nessa data ou depois dela em comparações de ordem cronológica.

I

Identificador
Um identificador é o nome de um objeto de banco de dados, como uma tabela ou coluna; sua grafia e o uso de aspas devem seguir as regras do banco de dados.
O identificador hire_date nomeia uma coluna, enquanto o texto entre aspas '2024-02-19' representa um valor.
ILIKE
ILIKE é o operador de busca de padrões do PostgreSQL que ignora maiúsculas e minúsculas; ele oferece uma alternativa específica desse banco de dados ao LIKE comum.
Uma busca no PostgreSQL com name ILIKE '%desk%' pode corresponder a nomes de produtos que contêm o texto Desk com inicial maiúscula.
IN
IN é um teste de pertencimento que verifica se um valor inteiro é igual a algum item de uma lista de valores permitidos entre parênteses.
department IN ('IT', 'Marketing') seleciona todos os funcionários de IT ou Marketing sem repetir uma comparação de departamento.
Intervalo de datas fechado à esquerda e aberto à direita
Um intervalo de datas fechado à esquerda e aberto à direita inclui seu limite inicial e exclui seu limite final, frequentemente o início do dia ou mês seguinte.
Um intervalo de datas fechado à esquerda e aberto à direita para março termina antes de '2024-04-01', preservando os horários tardios do último dia.
IS NOT DISTINCT FROM
IS NOT DISTINCT FROM é uma comparação que trata dois valores NULL como iguais, enquanto compara entradas diferentes de NULL como na igualdade comum.
SQLite e PostgreSQL oferecem IS NOT DISTINCT FROM quando uma comparação deve tratar dois marcadores de ausência como iguais.
IS NOT NULL
IS NOT NULL é um teste direto que é verdadeiro quando uma coluna escalar contém um valor presente, incluindo texto vazio onde ele é diferente de NULL.
O filtro phone IS NOT NULL mantém um funcionário cujo telefone está registrado, mesmo quando o departamento desse funcionário está ausente.
IS NULL
IS NULL é um teste direto de um valor escalar ausente; ao contrário da igualdade com NULL, ele fornece um resultado definido, verdadeiro ou falso.
phone IS NULL encontra os funcionários cujos registros de funcionários não têm valor de telefone registrado.

L

LIKE
LIKE é um operador de comparação de texto que verifica um valor inteiro em relação a um padrão com caracteres literais e caracteres curinga opcionais.
name LIKE '%Lamp%' encontra todos os nomes de produtos que contêm Lamp, quer Lamp apareça no início, no meio ou no fim.
LIMIT
LIMIT é uma cláusula de quantidade de linhas que retorna no máximo o número especificado de linhas de resultado, sem escolher uma classificação por conta própria.
Um filtro de funcionários de Boston com LIMIT 5 retorna apenas duas linhas quando só dois funcionários de Boston atendem à condição.
Limite inclusivo
Um limite inclusivo aceita um valor exatamente igual ao limite; os operadores de comparação >= e <= expressam essa inclusão.
Um limite inclusivo de 60000 mantém um funcionário cujo salário é exatamente 60000 quando o filtro usa salary >= 60000.
Limite inferior
Um limite inferior é o valor na parte inferior de um intervalo, colocado antes de AND no BETWEEN comum; inverter os limites não os troca automaticamente.
O limite inferior 89,00 em price BETWEEN 89.00 AND 15.50 excede o limite superior, não deixando correspondências.
Linha duplicada no resultado
Uma linha duplicada no resultado é aquela cujos valores selecionados correspondem todos aos de outra linha do resultado segundo as regras aplicáveis de comparação de duplicatas.
Dois funcionários com o mesmo departamento e a mesma cidade criam uma linha duplicada no resultado em uma lista de departamento e cidade, então DISTINCT mantém seu par uma vez.
Lista de valores de IN
Uma lista de valores de IN é uma coleção de possíveis correspondências separadas por vírgulas dentro de parênteses; a ordem de seus itens não ordena os resultados da consulta.
Uma lista de valores de IN como (6, 2, 2, 4) corresponde aos mesmos registros de funcionários que (2, 4, 6), apesar de sua ordem e repetição.
Literal de texto
Um literal de texto é um valor escrito diretamente entre aspas simples em SQL; um apóstrofo dentro do valor é duplicado para preservá-lo.
O literal de texto 'O''Neill' corresponde ao sobrenome O’Neill porque sua aspa duplicada representa um apóstrofo.
Literal numérico
Um literal numérico é um número escrito diretamente em SQL com algarismos e, quando necessário, um ponto decimal, sem notação de moeda.
O literal numérico 20.50 em price < 20.50 não tem aspas, separador de milhares ou símbolo de moeda.
Lógica de três valores
Lógica de três valores é o sistema da SQL para combinar condições verdadeiras, falsas e desconhecidas usando operadores como AND, OR e NOT.
Na lógica de três valores, um produto com estoque ausente passa em um teste de estoque OR preço quando seu ramo price > 100 é verdadeiro.

N

NOT
NOT é um operador lógico que transforma verdadeiro em falso e falso em verdadeiro; na SQL, ele mantém uma condição desconhecida como desconhecida.
Negar stock > 10 não inclui um produto com estoque ausente, porque essa linha ainda resulta em uma condição desconhecida.
NOT BETWEEN
NOT BETWEEN é a negação de um teste de intervalo inclusivo; para um valor diferente de NULL, mantém valores abaixo do extremo inferior ou acima do extremo superior.
stock NOT BETWEEN 5 AND 40 mantém um produto com estoque zero e outro com sessenta, mas exclui estoque ausente.
NOT IN
NOT IN é um teste de exclusão que exige que um valor seja diferente de cada item listado; um NULL na lista impede uma correspondência em WHERE.
city NOT IN ('Chicago', 'Denver') mantém os funcionários de Boston porque suas cidades diferem de ambas as entradas.
NULL
NULL é um marcador de valor ausente, como um dado desconhecido, não registrado ou não aplicável, e é diferente de um zero conhecido.
Quando um produto tem estoque NULL, sua linha não informa a quantidade de unidades atualmente no depósito.
NULLS LAST
NULLS LAST é um modificador de ORDER BY que coloca explicitamente valores ausentes depois dos valores registrados para sua coluna de ordenação associada.
department NULLS LAST coloca funcionários sem departamento registrado depois dos departamentos registrados em consultas nas versões atuais do SQLite e do PostgreSQL.

O

OFFSET
OFFSET é uma cláusula que pula uma quantidade especificada de linhas do resultado antes de o limite de linhas contar quais serão retornadas.
Com salários em ordem decrescente, LIMIT 3 OFFSET 3 pula as três pessoas com os maiores salários e retorna a quarta, a quinta e a sexta.
Operador de comparação
Um operador de comparação testa a relação entre dois valores, como igualdade ou qual é maior, e produz um estado lógico.
O operador de comparação >= inclui um funcionário com salário de exatamente 60000 em salary >= 60000 porque esse salário é igual ao limite.
OR
OR é um operador lógico cuja condição é verdadeira quando pelo menos uma condição unida é verdadeira, inclusive quando ambas são verdadeiras.
Sales OR Chicago inclui funcionários de Sales em outras cidades, funcionários de Chicago em outros departamentos e funcionários que correspondem a ambos.
Ordem das cláusulas
Ordem das cláusulas é a sequência escrita exigida pela SQL para as partes de uma instrução, incluindo WHERE antes de ORDER BY e a limitação de linhas depois.
A ordem exigida das cláusulas coloca WHERE antes de ORDER BY, então invertê-los produz um erro de sintaxe.
Ordem lógica de processamento
Ordem lógica de processamento é o modelo que explica o resultado de uma consulta por meio de leitura, filtragem, seleção, remoção de duplicatas, ordenação e recorte.
A ordem lógica de processamento remove cidades repetidas antes de LIMIT contar as linhas em um resultado DISTINCT de cidades.
Ordenação total
Uma ordenação total distingue cada linha do resultado por seus valores de ordenação, fornecendo posições reproduzíveis enquanto os dados permanecem inalterados.
A ordenação total ORDER BY city, employee_id determina a posição de cada funcionário por meio do identificador único.
ORDER BY
ORDER BY é a cláusula que organiza as linhas do resultado pelos valores de ordenação especificados; sem ela, a SQL não garante a ordem das linhas.
ORDER BY salary DESC coloca o funcionário mais bem pago em primeiro no resultado salarial sem alterar nenhum registro de funcionário armazenado.
Otimizador de consultas
Um otimizador de consultas escolhe um plano de execução interno que pode diferir do modelo lógico, preservando o resultado definido da consulta.
Um otimizador de consultas pode encontrar correspondências sem processar fisicamente a tabela inteira na ordem lógica usada para ensinar.

P

Página
Uma página é um recorte de um resultado de consulta; com n linhas por página, a página k pula as linhas das k − 1 páginas completas anteriores.
Com três linhas por página, a terceira página usa OFFSET 6 e mostra as linhas após a sexta em uma classificação salarial fixa.
Precedência de operadores
Precedência de operadores é a prioridade de avaliação de operadores combinados sem parênteses; entre operadores lógicos, NOT precede AND, que precede OR.
A precedência de operadores torna necessários parênteses quando uma exigência de cidade deve se aplicar a cada uma de duas alternativas de departamento unidas por OR.

T

Texto vazio
Texto vazio é uma cadeia conhecida com zero caracteres, escrita como duas aspas simples adjacentes; a maioria dos bancos de dados o distingue de NULL.
No SQLite, phone = '' verifica texto vazio e não encontra valores de telefone de funcionários que estão ausentes.
Tipo DATE
Um tipo DATE armazena datas do calendário como valores de data, permitindo que um banco de dados as compare por data em vez de pela formatação local de texto.
O tipo DATE do PostgreSQL aceita DATE '2022-01-01'; o SQLite não usa essa sintaxe de literal tipado.
TOP
TOP é a sintaxe de limite de linhas do SQL Server no nível de SELECT, usada com ORDER BY quando uma solicitação precisa de um conjunto específico de linhas maiores ou primeiras.
SELECT TOP (3) pode substituir LIMIT em uma lista curta de três linhas quando a consulta é escrita para o SQL Server.

V

Valor lógico desconhecido
Desconhecido é o terceiro estado lógico da SQL, produzido quando dados ausentes impedem uma comparação definida; WHERE exclui linhas nesse estado.
O estoque ausente de um produto produz um valor lógico desconhecido para stock > 10, então essa linha não passa no filtro.
Verificação do resultado
Uma verificação do resultado compara os campos, as linhas que atendem às condições, a ordem e a quantidade de linhas de uma consulta com a solicitação para detectar uma resposta plausível, mas incorreta.
Uma verificação do resultado no estoque zero de um produto explica por que ele está ausente de uma lista de produtos baratos e em estoque.
Verificação dos limites
Uma verificação dos limites testa valores exatamente no limite, logo abaixo ou logo acima dele para verificar se a consulta corresponde à inclusão solicitada.
Uma verificação dos limites usando um salário de exatamente 60000 distingue “pelo menos 60000” de um filtro estrito de maior que.

W

WITH TIES
WITH TIES estende um limite de linhas FETCH para incluir linhas adicionais iguais à linha de corte em todos os valores de ORDER BY, quando há suporte.
Com ORDER BY city, FETCH FIRST 3 ROWS WITH TIES retorna todas as linhas que compartilham a cidade da terceira linha, não apenas três linhas.

Sobre esta aula

Por StudeliRelatar um erro

Crie seus próprios Materiais de Estudo

Transforme suas anotações, slides e documentos em Guias de Estudo, Questões de Prática, Flashcards e mais 6 ferramentas.

Começar