SQLite Consulta: Selecionar, Onde, LIMIT, OFFSET, Contar, Agrupar por
โก Resumo Inteligente
SQLite As consultas recuperam e filtram dados usando as clรกusulas SELECT, FROM, WHERE, GROUP BY, ORDER BY e LIMIT. Combinando essas clรกusulas com operadores, agregaรงรตes, subconsultas e operaรงรตes de conjuntos, vocรช pode ler, formatar e resumir registros de qualquer banco de dados. SQLite base de dados.

As seรงรตes abaixo abordam a leitura de dados com SELECT e FROM, a filtragem de linhas com WHERE e seus operadores, a ordenaรงรฃo e limitaรงรฃo de resultados, funรงรตes de agregaรงรฃo, GROUP BY e HAVING, subconsultas, operaรงรตes de conjuntos, tratamento de valores NULL, expressรตes CASE e expressรตes de tabela comuns.
Escrever consultas SQL num SQLite banco de dados, vocรช precisa saber como funcionam as clรกusulas SELECT, FROM, WHERE, GROUP BY, ORDER BY e LIMIT e como usรก-las.
Durante este tutorial, vocรช aprenderรก como usar essas clรกusulas e como escrever SQLite clรกusulas.
Lendo dados com Select
A clรกusula SELECT รฉ a instruรงรฃo principal usada para consultar um SQLite base de dados. Na clรกusula SELECT, vocรช indica o que selecionar. Mas antes da clรกusula select, vamos ver de onde podemos selecionar os dados usando a clรกusula FROM.
A clรกusula FROM รฉ usada para especificar onde vocรช deseja selecionar os dados. Na clรกusula from, vocรช pode especificar uma ou mais tabelas ou subconsultas para selecionar os dados, como veremos mais adiante nos tutoriais.
Observe que, para todos os exemplos a seguir, vocรช deve executar sqlite3.exe e abrir uma conexรฃo com o banco de dados de amostra conforme flui:
Passo 1) Nesta etapa,
Abra "Meu Computador" e navegue atรฉ o seguinte diretรณrio: "C:\sqlite". Em seguida, execute o arquivo "sqlite3.exe".
Passo 2) Abra o banco de dados โTutorialsSampleDB.dbโ com o seguinte comando:
Agora vocรช estรก pronto para executar qualquer tipo de consulta no banco de dados.
Na clรกusula SELECT, vocรช pode selecionar nรฃo apenas um nome de coluna, mas tambรฉm tem muitas outras opรงรตes para especificar o que selecionar. Como segue:
SELECT *
Este comando selecionarรก todas as colunas de todas as tabelas referenciadas (ou subconsultas) na clรกusula FROM. Por exemplo:
SELECT * FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Isso selecionarรก todas as colunas das tabelas de alunos e de departamentos:
SELECIONE o nome da tabela.*
Isso selecionarรก todas as colunas apenas da tabela โtablenameโ. Por exemplo:
SELECT Students.* FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Isso selecionarรก todas as colunas apenas da tabela de alunos:
Um valor literal
Um valor literal รฉ um valor constante que pode ser especificado na instruรงรฃo select. Vocรช pode usar valores literais normalmente da mesma forma que usa nomes de colunas na clรกusula SELECT. Esses valores literais serรฃo exibidos para cada linha das linhas retornadas pela consulta SQL.
Aqui estรฃo alguns exemplos de diferentes valores literais que vocรช pode selecionar:
- Literal Numรฉrico โ nรบmeros em qualquer formato como 1, 2.55,โฆ etc.
- Literais de string โ Qualquer string 'EUA', 'este รฉ um texto de amostra',โฆ etc.
- NULO โ valor NULO.
- Current_TIME โ Fornece a hora atual.
- CURRENT_DATE โ isso lhe darรก a data atual.
Isso pode ser รบtil em algumas situaรงรตes em que vocรช precisa selecionar um valor constante para todas as linhas retornadas. Por exemplo, se vocรช deseja selecionar todos os alunos da tabela Alunos, com uma nova coluna chamada paรญs que contรฉm o valor โEUAโ, vocรช pode fazer o seguinte:
SELECT *, 'USA' AS Country FROM Students;
Isso lhe darรก todas as colunas dos alunos, alรฉm de uma nova coluna โPaรญsโ como esta:
Observe que esta nova coluna Paรญs nรฃo รฉ na verdade uma nova coluna adicionada ร tabela. ร uma coluna virtual, criada na consulta para exibiรงรฃo dos resultados e nรฃo serรก criada na tabela.
Nomes e apelidos
O alias รฉ um novo nome para a coluna que permite selecionar a coluna com um novo nome. Os aliases das colunas sรฃo especificados usando a palavra-chave โASโ.
Por exemplo, se vocรช deseja selecionar a coluna StudentName para ser retornada com โStudent Nameโ em vez de โStudentNameโ, vocรช pode fornecer um alias como este:
SELECT StudentName AS 'Student Name' FROM Students;
Isso lhe darรก os nomes dos alunos com o nome โNome do Alunoโ em vez de โNome do Alunoโ assim:
Note que o nome da coluna continua sendo โStudentNameโ; a coluna StudentName permanece a mesma, nรฃo muda com o alias.
O alias nรฃo alterarรก o nome da coluna; apenas alterarรก o nome de exibiรงรฃo na clรกusula SELECT.
Alรฉm disso, observe que a palavra-chave โASโ รฉ opcional, vocรช pode colocar o nome alternativo sem ela, algo assim:
SELECT StudentName 'Student Name' FROM Students;
E lhe darรก exatamente o mesmo resultado da consulta anterior:
Vocรช tambรฉm pode fornecer aliases de tabelas, nรฃo apenas colunas. Com a mesma palavra-chave โASโ. Por exemplo, vocรช pode fazer isso:
SELECT s.* FROM Students AS s;
Isso lhe darรก todas as colunas da tabela Alunos:
Isto pode ser muito รบtil se vocรช estiver participando de mais de uma mesa; em vez de repetir o nome completo da tabela na consulta, vocรช pode atribuir a cada tabela um nome alternativo curto. Por exemplo, na seguinte consulta:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Esta consulta selecionarรก o nome de cada aluno da tabela โAlunosโ com o nome do departamento da tabela โDepartamentosโ:
No entanto, a mesma consulta pode ser escrita assim:
SELECT s.StudentName, d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Atribuรญmos o alias โsโ ร tabela Alunos e o alias โdโ ร tabela Departamentos. Em vez de usar o nome completo da tabela, usamos seus aliases para nos referirmos a elas. O INNER JOIN une duas ou mais tabelas usando uma condiรงรฃo. Em nosso exemplo, unimos a tabela Alunos com a tabela Departamentos pela coluna DepartmentId. Hรก tambรฉm uma explicaรงรฃo detalhada do INNER JOIN no โSQLite Juntatutorial.
Isso lhe darรก a saรญda exata da consulta anterior:
ONDE
Escrever consultas SQL usando a clรกusula SELECT sozinha com a clรกusula FROM, como vimos na seรงรฃo anterior, fornecerรก todas as linhas das tabelas. Porรฉm, se quiser filtrar os dados retornados, vocรช deve adicionar uma clรกusula โWHEREโ.
A clรกusula WHERE รฉ usada para filtrar o conjunto de resultados retornado pela consulta SQL. Veja como a clรกusula WHERE funciona:
- Na clรกusula WHERE, vocรช pode especificar uma โexpressรฃoโ.
- Essa expressรฃo serรก avaliada para cada linha retornada das tabelas especificadas na clรกusula FROM.
- A expressรฃo serรก avaliada como uma expressรฃo booleana, com resultado verdadeiro, falso ou nulo.
- Entรฃo, somente as linhas para as quais a expressรฃo foi avaliada com um valor verdadeiro serรฃo retornadas, e aquelas com resultados falsos ou nulos serรฃo ignoradas e nรฃo incluรญdas no conjunto de resultados.
Para filtrar o conjunto de resultados usando a clรกusula WHERE, vocรช deve usar expressรตes e operadores.
Lista de operadores em SQLite e como usรก-los
Na seรงรฃo a seguir, explicaremos como vocรช pode filtrar usando expressรตes e operadores.
Expressรฃo รฉ um ou mais valores literais ou colunas combinadas entre si por meio de um operador.
Observe que vocรช pode usar expressรตes tanto na clรกusula SELECT quanto na clรกusula WHERE.
Nos exemplos a seguir, tentaremos as expressรตes e operadores tanto na clรกusula select quanto na clรกusula WHERE. Para mostrar como eles atuam.
Existem diferentes tipos de expressรตes e operadores que vocรช pode especificar da seguinte maneira:
SQLite o operador de concatenaรงรฃo โ||โ
Este operador รฉ usado para concatenar um ou mais valores literais ou colunas entre si. Ele produzirรก uma sequรชncia de resultados de todos os valores literais ou colunas concatenados. Por exemplo:
SELECT 'Id with Name: '|| StudentId || StudentName AS StudentIdWithName FROM Students;
Isso serรก concatenado em um novo alias โStudentIdWithNameโ:
- O valor literal da string โId com Nome: โ
- com o valor da coluna โStudentIdโ e
- com o valor da coluna โNomeDoAlunoโ
SQLite Operador CAST:
O operador CAST รฉ usado para converter um valor de um tipo para outro. tipo de dados para outro tipo de dados.
Por exemplo, se vocรช tiver um valor numรฉrico armazenado como uma string, como "'12.5'", e quiser convertรช-lo para um valor numรฉrico, vocรช pode usar o operador CAST para fazer isso, assim: "CAST('12.5' โโAS REAL)". Ou, se vocรช tiver um valor decimal, como 12.5, e precisar obter apenas a parte inteira, vocรช pode convertรช-lo para um inteiro assim: "CAST(12.5 AS INTEGER)".
Exemplo
No comando a seguir tentaremos converter valores diferentes em outros tipos de dados:
SELECT CAST('12.5' AS REAL) ToReal, CAST(12.5 AS INTEGER) AS ToInteger;
Isso lhe darรก:
O resultado รฉ o seguinte:
- CAST('12.5' โโAS REAL) โ o valor '12.5' โโรฉ um valor string, serรก convertido para um valor REAL.
- CAST(12.5 AS INTEGER) โ o valor 12.5 รฉ um valor decimal, serรก convertido para um valor inteiro. A parte decimal serรก truncada e se tornarรก 12.
SQLite Aritmรฉtica Operatores:
Pegue dois ou mais valores literais numรฉricos ou colunas numรฉricas e retorne um valor numรฉrico. Os operadores aritmรฉticos suportados em SQLite como:
- Adiรงรฃo โ+โ โ fornece a soma dos dois operandos.
- Subtracรงรฃo โโโ โ subtracsรฃo os dois operandos e resulta na diferenรงa.
- Multiplicaรงรฃo โ*โ โ o produto dos dois operandos.
- Resto (mรณdulo) โ%โ โ fornece o resto da divisรฃo de um operando pelo segundo operando.
- Divisรฃo โ/โ โ retorna o quociente resultante da divisรฃo do operando da esquerda pelo operando da direita.
Exemplo:
No exemplo a seguir, testaremos os cinco operadores aritmรฉticos com valores numรฉricos literais na mesma clรกusula select:
SELECT 25+6, 25-6, 25*6, 25%6, 25/6;
Isso lhe darรก:
Observe como usamos uma instruรงรฃo SELECT sem uma clรกusula FROM aqui. E isso รฉ permitido em SQLite contanto que selecionemos valores literais.
SQLite Operadores de comparaรงรฃo
Compare dois operandos entre si e retorne verdadeiro ou falso da seguinte forma:
- โ<โ โ retorna verdadeiro se o operando da esquerda for menor que o operando da direita.
- โ<=โ โ retorna verdadeiro se o operando da esquerda for menor ou igual ao operando da direita.
- โ>โ โ retorna verdadeiro se o operando da esquerda for maior que o operando da direita.
- โ>=โ โ retorna verdadeiro se o operando da esquerda for maior ou igual ao operando da direita.
- Os operadores โ=โ e โ==โ retornam verdadeiro se os dois operandos forem iguais. Observe que ambos os operadores sรฃo idรชnticos e nรฃo hรก diferenรงa entre eles.
- Os operadores โ!=โ e โ<>โ retornam verdadeiro se os dois operandos forem diferentes. Observe que ambos os operadores sรฃo idรชnticos e nรฃo hรก diferenรงa entre eles.
Observe que, SQLite expressa o valor verdadeiro com 1 e o valor falso com 0.
Exemplo:
SELECT 10<6 AS '<', 10<=6 AS '<=', 10>6 AS '>', 10>=6 AS '>=', 10=6 AS '=', 10==6 AS '==', 10!=6 AS '!=', 10<>6 AS '<>';
Isso darรก algo assim:
SQLite Operadores de correspondรชncia de padrรตes
โLIKEโ โ รฉ usado para correspondรชncia de padrรตes. Usando โLikeโ, vocรช pode pesquisar valores que correspondam a um padrรฃo especificado usando um caractere curinga.
O operando ร esquerda pode ser um valor literal de string ou uma coluna de string. O padrรฃo pode ser especificado da seguinte forma:
- Contรฉm um padrรฃo. Por exemplo, StudentName LIKE '%a%' โ isso pesquisarรก os nomes dos alunos que contรชm a letra โaโ em qualquer posiรงรฃo na coluna StudentName.
- Comeรงa com o padrรฃo. Por exemplo, โNomeDoAluno LIKE 'a%'โ โ busca pelos nomes dos alunos que comeรงam com a letra โaโ.
- Termina com o padrรฃo. Por exemplo, โNomeDoAluno LIKE '%a'โ โ Busca por nomes de alunos que terminam com a letra โaโ.
- A busca por qualquer caractere individual em uma string, utilizando o caractere sublinhado โ_โ, รฉ possรญvel. Por exemplo, โNomeDoAluno LIKE 'J___'โ โ Busca por nomes de alunos com 4 caracteres. O nome deve comeรงar com a letra โJโ e pode conter atรฉ trรชs outros caracteres adicionais apรณs o โJโ.
Exemplos de correspondรชncia de padrรตes:
Obtenha nomes de alunos que comeรงam com a letra 'j':
SELECT StudentName FROM Students WHERE StudentName LIKE 'j%';
Resultado:
Faรงa com que os nomes dos alunos terminem com a letra 'y':
SELECT StudentName FROM Students WHERE StudentName LIKE '%y';
Resultado:
Obtenha os nomes dos alunos que contenham a letra 'n':
SELECT StudentName FROM Students WHERE StudentName LIKE '%n%';
Resultado:
โGLOBโ โ รฉ equivalente ao operador LIKE, mas o GLOB diferencia maiรบsculas de minรบsculas, ao contrรกrio do operador LIKE. Por exemplo, os dois comandos a seguir retornarรฃo resultados diferentes:
SELECT 'Jack' GLOB 'j%'; SELECT 'Jack' LIKE 'j%';
Isso lhe darรก:
A primeira instruรงรฃo retorna 0(falso) porque o operador GLOB diferencia maiรบsculas de minรบsculas, entรฃo 'j' nรฃo รฉ igual a 'J'. No entanto, a segunda instruรงรฃo retornarรก 1 (verdadeiro) porque o operador LIKE nรฃo diferencia maiรบsculas de minรบsculas, entรฃo 'j' รฉ igual a 'J'.
Outros operadores:
SQLite E
Um operador lรณgico que combina uma ou mais expressรตes. Ele retornarรก verdadeiro apenas se todas as expressรตes produzirem um valor โverdadeiroโ. No entanto, retornarรก falso somente se todas as expressรตes produzirem um valor โfalsoโ.
Exemplo:
A consulta a seguir irรก procurar por alunos que tenham StudentId > 5 e StudentName comece com a letra N, os alunos retornados deverรฃo atender ร s duas condiรงรตes:
SELECT * FROM Students WHERE (StudentId > 5) AND (StudentName LIKE 'N%');
Como saรญda, na imagem acima, isso lhe darรก apenas โNancyโ. Nancy รฉ a รบnica aluna que atende a ambas as condiรงรตes.
SQLite OR
Um operador lรณgico que combina uma ou mais expressรตes, de modo que, se um dos operadores combinados resultar em verdadeiro, ele retornarรก verdadeiro. No entanto, se todas as expressรตes produzirem falso, retornarรก falso.
Exemplo:
A consulta a seguir irรก procurar por alunos que tenham StudentId > 5 ou StudentName comece com a letra N, os alunos retornados deverรฃo atender pelo menos uma das condiรงรตes:
SELECT * FROM Students WHERE (StudentId > 5) OR (StudentName LIKE 'N%');
Isso lhe darรก:
Como saรญda, na captura de tela acima, isso lhe darรก o nome de um aluno com a letra โnโ em seu nome mais o ID do aluno com valor> 5.
Como vocรช pode ver, o resultado รฉ diferente da consulta com o operador AND.
SQLite ENTRE
A funรงรฃo ENTRE รฉ usada para selecionar os valores que estรฃo dentro de um intervalo de dois valores. Por exemplo, โX ENTRE Y E Zโ retornarรก verdadeiro (1) se o valor X estiver entre os valores Y e Z. Caso contrรกrio, retornarรก falso (0). โX ENTRE Y E Zโ รฉ equivalente a โX >= Y E X <= Zโ, onde X deve ser maior ou igual a Y e X deve ser menor ou igual a Z.
Exemplo:
No exemplo de consulta a seguir, escreveremos uma consulta para obter alunos com valor de Id entre 5 e 8:
SELECT * FROM Students WHERE StudentId BETWEEN 5 AND 8;
Isso darรก apenas aos alunos com IDs 5, 6, 7 e 8:
SQLite IN
Leva um operando e uma lista de operandos. Ele retornarรก verdadeiro se o valor do primeiro operando for igual ao valor de um dos operandos da lista. O operador IN retorna verdadeiro (1) se a lista de operandos contiver o primeiro valor do operando dentro de seus valores. Caso contrรกrio, retornarรก falso (0).
Assim: โcol IN(x, y, z)โ. Isso รฉ equivalente a โ(col=x) ou (col=y) ou (col=z)โ.
Exemplo:
A consulta a seguir selecionarรก apenas alunos com IDs 2, 4, 6, 8:
SELECT * FROM Students WHERE StudentId IN(2, 4, 6, 8);
Gosto disto:
A consulta anterior fornecerรก o resultado exato da consulta a seguir porque sรฃo equivalentes:
SELECT * FROM Students WHERE (StudentId = 2) OR (StudentId = 4) OR (StudentId = 6) OR (StudentId = 8);
Ambas as consultas fornecem a saรญda exata. Porรฉm, a diferenรงa entre as duas consultas รฉ que na primeira consulta usamos o operador โINโ. Na segunda consulta, usamos vรกrios operadores โORโ.
O operador IN รฉ equivalente ao uso de mรบltiplos operadores OR. A expressรฃo โWHERE StudentId IN(2, 4, 6, 8)โ รฉ equivalente a โWHERE (StudentId = 2) OR (StudentId = 4) OR (StudentId = 6) OR (StudentId = 8);โ
Gosto disto:
SQLite NรO EM
O operador โNOT INโ รฉ o oposto do operador IN. Mas com a mesma sintaxe; ele recebe um operando e uma lista de operandos. Ele retornarรก verdadeiro se o valor do primeiro operando for diferente do valor de um dos operandos da lista. Ou seja, retornarรก verdadeiro (0) se a lista de operandos nรฃo contiver o primeiro operando. Assim: โcol NOT IN(x, y, z)โ. Isso รฉ equivalente a โ(col<>x) AND (col<>y) AND (col<>z)โ.
Exemplo:
A consulta a seguir selecionarรก alunos com IDs diferentes de um destes IDs 2, 4, 6, 8:
SELECT * FROM Students WHERE StudentId NOT IN(2, 4, 6, 8);
Assim
Na consulta anterior, fornecemos o resultado exato da consulta a seguir porque sรฃo equivalentes:
SELECT * FROM Students WHERE (StudentId <> 2) AND (StudentId <> 4) AND (StudentId <> 6) AND (StudentId <> 8);
Gosto disto:
Na captura de tela acima,
Usamos vรกrios operadores diferentes โ<>โ para obter uma lista de alunos que nรฃo sรฃo iguais a nenhum dos seguintes Id's 2, 4, 6 ou 8. Esta consulta retornarรก todos os outros alunos alรฉm desta lista de Id's.
SQLite EXISTE
Os operadores EXISTS nรฃo aceitam nenhum operando; leva apenas uma clรกusula SELECT depois dela. O operador EXISTS retornarรก verdadeiro (1) se houver alguma linha retornada da clรกusula SELECT e retornarรก falso (0) se nรฃo houver nenhuma linha retornada da clรกusula SELECT.
Exemplo:
No exemplo a seguir, selecionaremos o nome do departamento, caso o id do departamento exista na tabela alunos:
SELECT DepartmentName FROM Departments AS d WHERE EXISTS (SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId);
Isso lhe darรก:
Apenas os trรชs departamentos โTI, Fรญsica e Artesโ serรฃo retornados. O departamento โMatemรกticaโ nรฃo serรก retornado porque nรฃo hรก alunos matriculados nele, portanto, o ID do departamento nรฃo existe na tabela de alunos. ร por isso que o operador EXISTS ignorou o departamento โMatemรกticaโ.
SQLite NรO
Reverseรฉ o resultado do operador precedente que o sucede. Por exemplo:
- NOT BETWEEN โ Retornarรก verdadeiro se BETWEEN retornar falso e vice-versa.
- NOT LIKE โ Retornarรก verdadeiro se LIKE retornar falso e vice-versa.
- NOT GLOB โ Retornarรก verdadeiro se GLOB retornar falso e vice-versa.
- NOT EXISTS โ Retornarรก verdadeiro se EXISTS retornar falso e vice-versa.
Exemplo:
No exemplo a seguir, usaremos o operador NOT com o operador EXISTS para obter os nomes dos departamentos que nรฃo existem na tabela Alunos, que รฉ o resultado inverso do operador EXISTS. Assim, a busca serรก feita atravรฉs de DepartmentId que nรฃo existem na tabela departamento.
SELECT DepartmentName FROM Departments AS d WHERE NOT EXISTS (SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId);
Saรญda:
Somente o departamento "Matemรกtica" serรก retornado. Isso porque o departamento "Matemรกtica" รฉ o รบnico que nรฃo existe na tabela de alunos.
Limitaรงรฃo e Ordenaรงรฃo
SQLite Pedido
SQLite Ordem รฉ classificar seu resultado por uma ou mais expressรตes. Para ordenar o conjunto de resultados, vocรช deve usar a clรกusula ORDER BY da seguinte forma:
- Primeiro, vocรช deve especificar a clรกusula ORDER BY.
- A clรกusula ORDER BY deve ser especificada no final da consulta; somente a clรกusula LIMIT pode ser especificada depois dela.
- Especifique a expressรฃo para ordenar os dados; esta expressรฃo pode ser um nome de coluna ou uma expressรฃo.
- Apรณs a expressรฃo, vocรช pode especificar uma direรงรฃo de classificaรงรฃo opcional. DESC, para ordenar os dados em ordem decrescente ou ASC, para ordenar os dados em ordem crescente. Se vocรช nรฃo especificou nenhum deles, os dados seriam classificados em ordem crescente.
- Vocรช pode especificar mais expressรตes usando โ,โ entre si.
Exemplo
No exemplo a seguir, selecionaremos todos os alunos ordenados por seus nomes, mas em ordem decrescente, e depois pelo nome do departamento, em ordem crescente:
SELECT s.StudentName, d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId ORDER BY d.DepartmentName ASC , s.StudentName DESC;
Isso lhe darรก:
- SQLite primeiro ordenarรก todos os alunos pelo nome do departamento em ordem crescente
- Entรฃo, para cada nome de departamento, todos os alunos desse nome de departamento serรฃo exibidos em ordem decrescente por seus nomes.
SQLite Limite:
Vocรช pode limitar o nรบmero de linhas retornadas pela sua consulta SQL usando a clรกusula LIMIT. Por exemplo, LIMIT 10 fornecerรก apenas 10 linhas e ignorarรก todas as outras linhas.
Na clรกusula LIMIT, vocรช pode selecionar um nรบmero especรญfico de linhas a partir de uma posiรงรฃo especรญfica usando a clรกusula OFFSET. Por exemplo, โLIMIT 4 OFFSET 4โ ignorarรก as primeiras 4 linhas e retornarรก 4 linhas a partir da quinta linha, de modo que vocรช obterรก as linhas 5, 6, 7 e 8.
Observe que a clรกusula OFFSET รฉ opcional; vocรช pode escrevรช-la como "LIMIT 4, 4" e obterรก os resultados exatos.
Exemplo:
No exemplo a seguir, retornaremos apenas 3 alunos a partir do ID de aluno 5 usando a consulta:
SELECT * FROM Students LIMIT 4,3;
Isso lhe darรก apenas trรชs alunos comeรงando na linha 5. Portanto, vocรช terรก as linhas com StudentId 5, 6 e 7:
Removendo duplicatas
Se sua consulta SQL retornar valores duplicados, vocรช pode usar a palavra-chave โDISTINCTโ para remover essas duplicatas e retornar apenas valores distintos. Vocรช pode especificar mais de uma coluna apรณs a palavra-chave DISTINCT.
Exemplo:
A consulta a seguir retornarรก โvalores de nome de departamentoโ duplicados: Aqui temos valores duplicados com nomes TI, Fรญsica e Artes.
SELECT d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Isso fornecerรก valores duplicados para o nome do departamento:
Observe como existem valores duplicados para o nome do departamento. Agora, usaremos a palavra-chave DISTINCT com a mesma consulta para remover essas duplicatas e obter apenas valores exclusivos. Assim:
SELECT DISTINCT d.DepartmentName FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Isso fornecerรก apenas trรชs valores exclusivos para a coluna do nome do departamento:
Agregado
SQLite Agregados sรฃo funรงรตes integradas definidas em SQLite que agruparรก vรกrios valores de vรกrias linhas em um valor.
Aqui estรฃo os agregados suportados por SQLite:
SQLite AVG()
Devolveu a mรฉdia de todos os valores de x.
Exemplo:
No exemplo a seguir, obteremos a nota mรฉdia que os alunos obtiveram em todos os exames:
SELECT AVG(Mark) FROM Marks;
Isso lhe darรก o valor โ18.375โ:
Esses resultados vรชm da soma de todos os valores das notas divididos por sua contagem.
CONTAGEM() โ CONTAGEM(X) ou CONTAGEM(*)
Retorna a contagem total do nรบmero de vezes que o valor x apareceu. E aqui estรฃo algumas opรงรตes que vocรช pode usar com COUNT:
- COUNT(x): conta apenas valores de x, onde x รฉ o nome de uma coluna. Ele irรก ignorar valores NULL.
- COUNT(*): conta todas as linhas de todas as colunas.
- COUNT (DISTINCT x): Vocรช pode especificar uma palavra-chave DISTINCT antes de x, que obterรก a contagem dos valores distintos de x.
Exemplo
No exemplo a seguir, obteremos a contagem total de departamentos com COUNT(DepartmentId), COUNT(*) e COUNT(DISTINCT DepartmentId) e como eles sรฃo diferentes:
SELECT COUNT(DepartmentId), COUNT(DISTINCT DepartmentId), COUNT(*) FROM Students;
Isso lhe darรก:
Como segue:
- COUNT(DepartmentId) fornecerรก a contagem de todos os IDs do departamento e ignorarรก os valores nulos.
- COUNT(DISTINCT DepartmentId) fornece valores distintos de DepartmentId, que sรฃo apenas 3. Quais sรฃo os trรชs valores diferentes do nome do departamento. Observe que existem 8 valores de nome de departamento no nome do aluno. Mas apenas os trรชs valores diferentes que sรฃo Matemรกtica, TI e Fรญsica.
- COUNT(*) conta o nรบmero de linhas na tabela de alunos que sรฃo 10 linhas para 10 alunos.
GROUP_CONCAT() โ GROUP_CONCAT(X) ou GROUP_CONCAT(X,Y)
A funรงรฃo agregada GROUP_CONCAT concatena mรบltiplos valores em um valor com uma vรญrgula para separรก-los. Possui as seguintes opรงรตes:
- GROUP_CONCAT(X): Isso irรก concatenar todos os valores de x em uma string, com a vรญrgula โ,โ usada como separador entre os valores. Valores NULL serรฃo ignorados.
- GROUP_CONCAT(X, Y): Isso concatenarรก os valores de x em uma string, com o valor de y usado como separador entre cada valor em vez do separador padrรฃo ','. Valores NULL tambรฉm serรฃo ignorados.
- GROUP_CONCAT(DISTINCT X): Isso irรก concatenar todos os valores distintos de x em uma string, com a vรญrgula โ,โ usada como separador entre os valores. Valores NULL serรฃo ignorados.
Exemplo de GROUP_CONCAT(NomeDepartamento)
A consulta a seguir concatenarรก todos os valores do nome do departamento dos alunos e da tabela de departamentos em uma string separada por vรญrgula. Entรฃo, em vez de retornar uma lista de valores, um valor em cada linha. Ele retornarรก apenas um valor em uma linha, com todos os valores separados por vรญrgula:
SELECT GROUP_CONCAT(d.DepartmentName) FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Isso lhe darรก:
Isso lhe darรก a lista de valores de nomes de 8 departamentos concatenados em uma string separada por vรญrgula.
Exemplo de GROUP_CONCAT(DISTINCT NomeDepartamento)
A consulta a seguir concatenarรก os valores distintos do nome do departamento da tabela de alunos e departamentos em uma string separada por vรญrgula:
SELECT GROUP_CONCAT(DISTINCT d.DepartmentName) FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Isso lhe darรก:
Observe como o resultado รฉ diferente do resultado anterior; apenas trรชs valores foram retornados, que sรฃo os nomes dos departamentos distintos, e os valores duplicados foram removidos.
GROUP_CONCAT(NomeDepartamento ,'&') Exemplo
A consulta a seguir concatenarรก todos os valores da coluna de nome do departamento da tabela de alunos e departamentos em uma string, mas com o caractere '&' em vez de uma vรญrgula como separador:
SELECT GROUP_CONCAT(d.DepartmentName, '&') FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;
Isso lhe darรก:
Observe como o caractere โ&โ รฉ usado em vez do caractere padrรฃo โ,โ para separar os valores.
SQLite MรX() e MรN()
MAX(X) retorna o valor mais alto dos valores X. MAX retornarรก um valor NULL se todos os valores de x forem nulos. Enquanto MIN(X) retorna o menor valor dos valores X. MIN retornarรก um valor NULL se todos os valores de X forem nulos.
Exemplo
Na consulta a seguir, usaremos as funรงรตes MIN e MAX para obter a nota mais alta e a nota mais baixa da tabela โNotasโ:
SELECT MAX(Mark), MIN(Mark) FROM Marks;
Isso lhe darรก:
SQLite SOMA(x), Total(x)
Ambos retornarรฃo a soma de todos os valores de x. Mas eles sรฃo diferentes no seguinte:
- SUM retornarรก nulo se todos os valores forem nulos, mas Total retornarรก 0.
- TOTAL sempre retorna valores de ponto flutuante. SUM retorna um valor inteiro se todos os valores de x forem inteiros. No entanto, se os valores nรฃo forem inteiros, retornarรก um valor de ponto flutuante.
Exemplo
Na consulta a seguir, usaremos SUM e total para obter a soma de todas as notas nas tabelas "Notas":
SELECT SUM(Mark), TOTAL(Mark) FROM Marks;
Isso lhe darรก:
Como vocรช pode ver, TOTAL sempre retorna um ponto flutuante. Mas SUM retorna um valor inteiro porque os valores na coluna โMarcaโ podem estar em nรบmeros inteiros.
Exemplo de diferenรงa entre SUM e TOTAL:
Na consulta a seguir mostraremos a diferenรงa entre SUM e TOTAL quando eles obtรชm a SOMA dos valores NULL:
SELECT SUM(Mark), TOTAL(Mark) FROM Marks WHERE TestId = 4;
Isso lhe darรก:
Observe que nรฃo hรก marcas para TestId = 4, portanto hรก valores nulos para esse teste. SUM retorna um valor nulo em branco, enquanto TOTAL retorna 0.
Agrupar POR
A clรกusula GROUP BY รฉ usada para especificar uma ou mais colunas que serรฃo usadas para agrupar as linhas em grupos. As linhas com os mesmos valores serรฃo reunidas (organizadas) em grupos.
Para qualquer outra coluna que nรฃo esteja incluรญda no grupo por colunas, vocรช pode usar uma funรงรฃo agregada para ela.
Exemplo:
A consulta a seguir fornecerรก o nรบmero total de alunos presentes em cada departamento.
SELECT d.DepartmentName, COUNT(s.StudentId) AS StudentsCount FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId GROUP BY d. DepartmentName;
Isso lhe darรก:
A clรกusula GROUPBY DepartmentName agruparรก todos os alunos em grupos, um para cada nome de departamento. Para cada grupo de โdepartamentoโ, contarรฃo os alunos que nele integram.
clรกusula HAVING
Se quiser filtrar os grupos retornados pela clรกusula GROUP BY, vocรช pode especificar uma clรกusula โHAVINGโ com expressรฃo apรณs GROUP BY. A expressรฃo serรก usada para filtrar esses grupos.
Exemplo
Na consulta a seguir, selecionaremos os departamentos que possuem apenas dois alunos:
SELECT d.DepartmentName, COUNT(s.StudentId) AS StudentsCount FROM Students AS s INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId GROUP BY d. DepartmentName HAVING COUNT(s.StudentId) = 2;
Isso lhe darรก:
A clรกusula HAVING COUNT(S.StudentId) = 2 filtrarรก os grupos retornados e retornarรก apenas os grupos que contรชm exatamente dois alunos. No nosso caso, o departamento de Artes tem 2 alunos, por isso รฉ exibido na saรญda.
SQLite Consulta e subconsulta
Dentro de qualquer consulta, vocรช pode usar outra consulta em SELECT, INSERT, DELETE, UPDATE ou dentro de outra subconsulta.
Essa consulta aninhada รฉ chamada de subconsulta. Veremos agora alguns exemplos de uso de subconsultas na clรกusula SELECT. No entanto, no tutorial Modificando dados, veremos como podemos usar subconsultas com as instruรงรตes INSERT, DELETE e UPDATE.
Usando subconsulta no exemplo da clรกusula FROM
Na consulta a seguir incluiremos uma subconsulta dentro da clรกusula FROM:
SELECT s.StudentName, t.Mark FROM Students AS s INNER JOIN ( SELECT StudentId, Mark FROM Tests AS t INNER JOIN Marks AS m ON t.TestId = m.TestId ) ON s.StudentId = t.StudentId;
A pergunta:
SELECT StudentId, Mark FROM Tests AS t INNER JOIN Marks AS m ON t.TestId = m.TestId
A consulta acima รฉ chamada de subconsulta aqui porque estรก aninhada dentro da clรกusula FROM. Observe que demos a ele um nome alternativo โtโ para que possamos nos referir ร s colunas retornadas por ele na consulta.
Esta consulta lhe darรก:
Entรฃo, no nosso caso,
- s.StudentName รฉ selecionado na consulta principal que fornece o nome dos alunos e
- t.Mark รฉ selecionado na subconsulta; que dรก notas obtidas por cada um desses alunos
Usando subconsulta no exemplo da clรกusula WHERE
Na consulta a seguir incluiremos uma subconsulta na clรกusula WHERE:
SELECT DepartmentName FROM Departments AS d WHERE NOT EXISTS (SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId);
A pergunta:
SELECT DepartmentId FROM Students AS s WHERE d.DepartmentId = s.DepartmentId
A consulta acima รฉ chamada de subconsulta aqui porque estรก aninhada na clรกusula WHERE. A subconsulta retornarรก os valores DepartmentId que serรฃo utilizados pelo operador NOT EXISTS.
Esta consulta lhe darรก:
Na consulta acima, selecionamos o departamento que nรฃo possui nenhum aluno matriculado. Que รฉ o departamento de โMatemรกticaโ aqui.
Conjunto Operaรงรตes โ UNION,Intersect
SQLite suporta as seguintes operaรงรตes SET:
UNIรO E UNIรO TODOS
Ele combina um ou mais conjuntos de resultados (um grupo de linhas) retornados de diversas instruรงรตes SELECT em um conjunto de resultados.
UNION retornarรก valores distintos. No entanto, UNION ALL nรฃo incluirรก e incluirรก duplicatas.
Observe que o nome da coluna serรก o nome da coluna especificado na primeira instruรงรฃo SELECT.
Exemplo de UNIรO
No exemplo a seguir, obteremos a lista de DepartmentId da tabela de alunos e a lista de DepartmentId da tabela de departamentos na mesma coluna:
SELECT DepartmentId AS DepartmentIdUnioned FROM Students UNION SELECT DepartmentId FROM Departments;
Isso lhe darรก:
A consulta retorna apenas 5 linhas que sรฃo valores de ID de departamento distintos. Observe o primeiro valor que รฉ o valor nulo.
SQLite UNIรO TODOS Exemplo
No exemplo a seguir, obteremos a lista de DepartmentId da tabela de alunos e a lista de DepartmentId da tabela de departamentos na mesma coluna:
SELECT DepartmentId AS DepartmentIdUnioned FROM Students UNION ALL SELECT DepartmentId FROM Departments;
Isso lhe darรก:
A consulta retornarรก 14 linhas, 10 linhas da tabela de alunos e 4 da tabela de departamentos. Observe que hรก duplicatas nos valores retornados. Alรฉm disso, observe que o nome da coluna foi aquele especificado na primeira instruรงรฃo SELECT.
Agora, vamos ver como UNION all darรก resultados diferentes se substituirmos UNION ALL por UNION:
SQLite INTERSEรรO
Retorna os valores existentes em ambos os conjuntos de resultados combinados. Os valores que existem em um dos conjuntos de resultados combinados serรฃo ignorados.
Exemplo
Na consulta a seguir, selecionaremos os valores DepartmentId que existem nas tabelas Alunos e Departamentos na coluna DepartmentId:
SELECT DepartmentId FROM Students Intersect SELECT DepartmentId FROM Departments;
Isso lhe darรก:
A consulta retorna apenas trรชs valores 1, 2 e 3. Quais sรฃo os valores que existem em ambas as tabelas.
Porรฉm, os valores nulos e 4 nรฃo foram incluรญdos porque o valor nulo existe apenas na tabela de alunos e nรฃo na tabela de departamentos. E o valor 4 existe na tabela departamentos e nรฃo na tabela alunos.
ร por isso que os valores NULL e 4 foram ignorados e nรฃo incluรญdos nos valores retornados.
EXCETO
Suponha que se vocรช tiver duas listas de linhas, lista1 e lista2, e quiser apenas as linhas da lista1 que nรฃo existem na lista2, vocรช pode usar a clรกusula โEXCEPTโ. A clรกusula EXCEPT compara as duas listas e retorna as linhas que existem na lista1 e nรฃo existem na lista2.
Exemplo
Na consulta a seguir, selecionaremos os valores DepartmentId que existem na tabela de departamentos e nรฃo existem na tabela de alunos:
SELECT DepartmentId FROM Departments EXCEPT SELECT DepartmentId FROM Students;
Isso lhe darรก:
A consulta retorna apenas o valor 4. Que รฉ o รบnico valor que existe na tabela departamentos e nรฃo existe na tabela alunos.
Tratamento NULO
O valor โNULLโ รฉ um valor especial em SQLiteร usado para representar um valor desconhecido ou ausente. Observe que o valor nulo รฉ totalmente diferente de "0" ou de um espaรงo em branco (""). Enquanto 0 e o espaรงo em branco sรฃo valores conhecidos, o valor nulo รฉ desconhecido.
Valores NULL requerem um tratamento especial em SQLite, veremos agora como lidar com os valores NULL.
Pesquisar valores NULL
Vocรช nรฃo pode usar o operador de igualdade normal (=) para pesquisar valores nulos. Por exemplo, a consulta a seguir procura os alunos que possuem um valor DepartmentId nulo:
SELECT * FROM Students WHERE DepartmentId = NULL;
Esta consulta nรฃo darรก nenhum resultado:
Como o valor NULL nรฃo รฉ igual a nenhum outro valor que inclua um valor nulo, รฉ por isso que nรฃo retornou nenhum resultado.
No entanto, para que a consulta funcione, vocรช precisa usar o operador โIS NULLโ para procurar valores nulos, da seguinte forma:
SELECT * FROM Students WHERE DepartmentId IS NULL;
Isso lhe darรก:
A consulta retornarรก os alunos que possuem um valor DepartmentId nulo.
Se vocรช deseja obter os valores que nรฃo sรฃo nulos, entรฃo vocรช precisa usar o operador โIS NOT NULLโ desta forma:
SELECT * FROM Students WHERE DepartmentId IS NOT NULL;
Isso lhe darรก:
A consulta retornarรก os alunos que nรฃo possuem um valor NULL DepartmentId.
Resultados condicionais
Se vocรช tiver uma lista de valores e quiser selecionar qualquer um deles com base em algumas condiรงรตes. Para isso, a condiรงรฃo desse valor especรญfico deve ser verdadeira para ser selecionado.
A expressรฃo CASE avaliarรก esta lista de condiรงรตes para todos os valores. Se a condiรงรฃo for verdadeira, ele retornarรก esse valor.
Por exemplo, se vocรช tiver uma coluna โNotaโ e quiser selecionar um valor de texto com base no valor da nota da seguinte forma:
โ โExcelenteโ se a nota for superior a 85 valores.
โ โMuito Bomโ se a nota estiver entre 70 e 85.
โ โBomโ se a nota estiver entre 60 e 70.
Entรฃo vocรช pode usar a expressรฃo CASE para fazer isso.
Isso pode ser usado para definir alguma lรณgica na clรกusula SELECT para que vocรช possa selecionar determinados resultados dependendo de certas condiรงรตes, como a instruรงรฃo if, por exemplo.
O operador CASE pode ser definido com diferentes sintaxes como segue:
Vocรช pode usar diferentes condiรงรตes:
CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 WHEN condition3 THEN result3 โฆ ELSE resultn END
Ou vocรช pode usar apenas uma expressรฃo e colocar diferentes valores possรญveis para escolher:
CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 WHEN value3 THEN result3 โฆ ELSE restuln END
Observe que a clรกusula ELSE รฉ opcional.
Exemplo
No exemplo a seguir, usaremos a expressรฃo CASE com o valor NULL na coluna "Id do departamento" da tabela "Alunos" para exibir o texto "Sem departamento", conforme mostrado abaixo:
SELECT StudentName, CASE WHEN DepartmentId IS NULL THEN 'No Department' ELSE DepartmentId END AS DepartmentId FROM Students;
- O operador CASE verificarรก o valor do DepartmentId se รฉ nulo ou nรฃo.
- Se for um valor NULL, ele selecionarรก o valor literal 'No Department' em vez do valor DepartmentId.
- Se nรฃo for um valor nulo, selecionarรก o valor da coluna DepartmentId.
Isso lhe darรก a saรญda como mostrado abaixo:
Expressรฃo de tabela comum
Expressรตes de tabela comuns (CTEs) sรฃo subconsultas definidas dentro da instruรงรฃo SQL com um determinado nome.
Ele tem uma vantagem sobre as subconsultas porque รฉ definido a partir das instruรงรตes SQL e tornarรก as consultas mais fรกceis de ler, manter e compreender.
Uma expressรฃo de tabela comum pode ser definida colocando a clรกusula WITH na frente de instruรงรตes SELECT da seguinte forma:
WITH CTEname AS ( SELECT statement ) SELECT, UPDATE, INSERT, or update statement here FROM CTE
O โnome da CTEโ รฉ qualquer nome que vocรช possa dar ร CTE; vocรช poderรก usรก-lo para se referir a ela posteriormente. Observe que vocรช pode definir instruรงรตes SELECT, UPDATE, INSERT ou DELETE em CTEs.
Agora vamos ver um exemplo de como usar CTE na clรกusula SELECT.
Exemplo
No exemplo a seguir, definiremos um CTE a partir de uma instruรงรฃo SELECT e o usaremos posteriormente em outra consulta:
WITH AllDepartments AS ( SELECT DepartmentId, DepartmentName FROM Departments ) SELECT s.StudentId, s.StudentName, a.DepartmentName FROM Students AS s INNER JOIN AllDepartments AS a ON s.DepartmentId = a.DepartmentId;
Nessa consulta, definimos uma CTE e a nomeamos de โAllDepartmentsโ. Essa CTE foi definida a partir de uma consulta SELECT:
SELECT DepartmentId, DepartmentName FROM Departments
Depois de definirmos o CTE, usamos-o na consulta SELECT que vem depois dele.
Observe que as expressรตes de tabela comuns nรฃo afetam a saรญda da consulta. ร uma forma de definir uma visรฃo lรณgica ou subconsulta para reutilizรก-las na mesma consulta. Expressรตes de tabela comuns sรฃo como uma variรกvel que vocรช declara e a reutiliza como uma subconsulta. Somente a instruรงรฃo SELECT afeta a saรญda da consulta.
Esta consulta lhe darรก:
Consultas avanรงadas
Consultas avanรงadas sรฃo aquelas que contรชm junรงรตes complexas, subconsultas e algumas agregaรงรตes. Na seรงรฃo a seguir veremos um exemplo de consulta avanรงada:
Onde conseguimos,
- Nomes dos departamentos com todos os alunos de cada departamento
- Nome dos alunos separados por vรญrgula e
- Mostrar o departamento com pelo menos trรชs alunos
SELECT d.DepartmentName, COUNT(s.StudentId) StudentsCount, GROUP_CONCAT(StudentName) AS Students FROM Departments AS d INNER JOIN Students AS s ON s.DepartmentId = d.DepartmentId GROUP BY d.DepartmentName HAVING COUNT(s.StudentId) >= 3;
Adicionamos uma clรกusula JOIN para obter o DepartmentName da tabela Departments. Em seguida, adicionamos uma clรกusula GROUP BY com duas funรงรตes de agregaรงรฃo:
- โCOUNTโ para contar os alunos de cada grupo de departamento.
- GROUP_CONCAT para concatenar alunos para cada grupo com vรญrgula separada em uma string.
Apรณs GROUP BY, utilizamos a clรกusula HAVING para filtrar os departamentos e selecionar apenas aqueles departamentos que possuem pelo menos 3 alunos.
O resultado serรก o seguinte:




















































