SQLite Consulta: Selecionar, Onde, LIMIT, OFFSET, Contar, Agrupar por
Para escrever consultas SQL em um 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"E
- Em seguida, abra โsqlite3.exe":
Passo 2) Abra o banco de dados โTutoriaisSampleDB.dbโpelo 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:
Observe que o nome da coluna ainda โNome do alunoโ; a coluna StudentName continua a mesma, nรฃo muda pelo 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;
- Demos ร tabela Alunos um alias โsโ e ร tabela departamentos um alias โdโ.
- Entรฃo, em vez de usar o nome completo da tabela, usamos seus apelidos para nos referirmos a elas.
- INNER JOIN une duas ou mais tabelas usando uma condiรงรฃo. Em nosso exemplo, unimos a tabela Alunos ร tabela Departamentos com a coluna DepartmentId. Hรก tambรฉm uma explicaรงรฃo detalhada para INNER JOIN no โSQLite Tutorial de junรงรตesโ.
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 pelo Consulta SQL. ร assim que funciona a clรกusula WHERE:
- 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 irรก concatenar em um novo alias โStudentIdWithName":
- O valor literal da string โID com nome: "
- com o valor de โIdentidade estudantilโcoluna e
- com o valor de โNome do alunoโ coluna
SQLite Operador CAST:
O operador CAST รฉ usado para converter um valor de um tipo de dados para outro tipo de dados.
Por exemplo, se vocรช tiver um valor numรฉrico armazenado como um valor de string como este โ '12.5' โE vocรช deseja convertรช-lo em um valor numรฉrico, vocรช pode usar o operador CAST para fazer isso assimโCAST('12.5' COMO REAL)โ. Ou se vocรช tiver um valor decimal como 12.5 e precisar obter apenas a parte inteira, poderรก convertรช-lo em um nรบmero inteiro como este โ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:
|
Exemplo:
No exemplo a seguir, tentaremos os cinco operadores aritmรฉticos com valores numรฉricos literais no mesmo
clรกusula de seleรงรฃo:
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:
|
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
"COMOโ- รฉ usado para correspondรชncia de padrรตes. Usando "Comoโ, vocรช pode procurar valores que correspondam a um padrรฃo especificado usando um 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 padrรฃo. Por exemplo, NomeDoAluno LIKE '%a%' โ buscarรก os nomes dos alunos que contenham a letra โaโ em qualquer posiรงรฃo da coluna StudentName.
- Comeรงa com o padrรฃo. Por exemplo, "NomeDoAluno LIKE 'a%'โ โ pesquise os nomes dos alunos que comeรงam com a letra โaโ.
- Termina com o padrรฃo. Por exemplo, "NomeAluno LIKE '%a'โ โ Pesquise os nomes dos alunos que terminam com a letra โaโ.
- Corresponder qualquer caractere รบnico em uma string usando a letra sublinhada โ_โ. Por exemplo, "Nome do Aluno COMO 'J___'โ โ Pesquise nomes de alunos com 4 caracteres. Deve comeรงar com a letra โJโ e pode ter mais trรชs caracteres apรณs a letra โ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:
โGLOBOโ โ รฉ equivalente ao operador LIKE, mas 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
BETWEEN รฉ usado 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 dois valores Y e Z. Caso contrรกrio, retornarรก falso (0). โX ENTRE Y E Z" รฉ equivalente a "X >= Y E X <= Zโ, X deve ser maior ou igual a Y e X รฉ 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: "coluna 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 vรกrios operadores OR. O "ONDE StudentId IN(2, 4, 6, 8)" รฉ equivalente a " ONDE (StudentId = 2) OU (StudentId = 4) OU (StudentId = 6) OU (StudentId = 8);"
Gosto disto:
SQLite NรO EM
O operando โNOT INโ รฉ o oposto do operador IN. Mas com a mesma sintaxe; รฉ necessรกrio um operando e uma lista de operandos. Ele retornarรก verdadeiro se o valor do primeiro operando nรฃo for igual ao valor de um dos operandos da lista. ou seja, retornarรก verdadeiro (0) se a lista de operandos nรฃo contiver o primeiro operando. Assim: "coluna NรO EM (x, y, z)โ. Isto รฉ 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รก retornado. E o nome do departamento โMatemรกticaโ nรฃo serรก retornado porque nรฃo hรก aluno naquele departamento, portanto o Id do departamento nรฃo existe na tabela de alunos. ร por isso que o operador EXISTS ignorou o โMatemรกticaโdepartamento.
SQLite NรO
Revsubstitui o resultado do operador precedente que vem depois dele. 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. Porque o "Matemรกticaโ departamento รฉ o รบnico departamento 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 comeรงando em uma posiรงรฃo especรญfica usando a clรกusula OFFSET. Por exemplo, "LIMITE 4 DESVIO 4โIgnorarรก as primeiras 4 linhas e retornarรก 4 linhas comeรงando na quinta linha, entรฃo vocรช obterรก as linhas 5,6,7 e 8.
Observe que a clรกusula OFFSET รฉ opcional, vocรช pode escrevรช-la como โLIMITE 4, 4โE lhe darรก 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 o โDISTINCTโpalavra-chave para remover essas duplicatas e retornar valores distintos. Vocรช pode especificar mais de uma coluna apรณs a chave DISTINCT funcionar.
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 de โmarcas" mesa:
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 marcas no โmarcasโtabelas:
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 "NULLโ valor รฉ um valor especial em SQLite. ร usado para representar um valor desconhecido ou ausente. Observe que o valor nulo รฉ totalmente diferente de โ0โou valor โโ em branco. Entretanto, como 0 e o valor 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 fazer a consulta funcionar, vocรช deve usar o "ร NULO" operador 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 esses valores que nรฃo sรฃo nulos, vocรช deve usar o โNรO ร NULOโoperador como este:
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 o CASO expressรฃo com NULL valor na coluna ID do departamento na tabela Alunos para exibir o texto 'Nenhum departamento' da seguinte forma:
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 "CTEnomeโ รฉ qualquer nome que vocรช possa dar ao CTE, vocรช pode usรก-lo para consultรก-lo posteriormente. Observe que vocรช pode definir a instruรงรฃo 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;
Nesta consulta, definimos um CTE e demos a ele o nome โTodos os departamentosโ. Este CTE foi definido 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;
Nรณs adicionamos um Cadastre-se clรกusula para obter o DepartmentName da tabela Departments. Depois disso adicionamos uma clรกusula GROUP BY com duas funรงรตes agregadas:
- โ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:
Resumo
Esta foi uma introduรงรฃo ร escrita SQLite consultas e os fundamentos da consulta ao banco de dados e como vocรช pode filtrar os dados retornados. Agora vocรช pode escrever o seu prรณprio SQLite consultas.




















































