IN é um operador para especificar vários valores em uma cláusula WHERE. Com ele podemos verificar se determinada coluna está sendo mencionada em um determinado grupo de valores, seja ele definido manualmente ou através de subquerys.
Guia do artigo:
Visão geral
A utilização do IN é semelhante a cláusula EXISTS, porém, ela permite que você defina um conjunto de valores pré-definidos para consulta.
Considere o seguinte cenário, temos a tabela aluno (Tabela 1), responsável por armazenar todos os dados referentes aos alunos da instituição, a tabela status (Tabela 2), responsável por armazenar o status atual dos alunos, e a tabela turma (Tabela 3), responsável por armazenar as informações de turma de cada aluno.
id | nome | Id_turma | Id_status | |
1 | João Fernando | joao@gmail.com | 1 | 1 |
2 | Maria Carvalho | maria@gmail.com | 1 | 1 |
3 | Bruna dos Santos | bruna@gmail.com | 2 | 3 |
4 | Pedro da Silva | pedro@gmail.com | 2 | 5 |
5 | Tiago | tiago@gmail.com | 1 | 5 |
id | status |
1 | Aprovado |
2 | Reprovado |
3 | Aguardando nota |
4 | Abandono |
5 | Trancado |
id | nome |
1 | Turma A |
2 | Turma B |
3 | Turma C |
Suponhamos que seja necessário trazer todos os alunos que ainda estejam cursando um determinado curso. Dessa forma, não podemos trazer alunos que estejam com status de reprovado, trancado ou abandono, selecionaremos apenas alunos que estejam com o ID_STATUS em um determinado grupo de STATUS, conforme a query abaixo:
SELECT
A.nome,
T.nome as Turma,
S.status as Status
FROM
Aluno A
INNER JOIN
Turma T
ON T.id = A.id_turma
INNER JOIN
Status S
ON S.id = A.id_status
WHERE
A.id_status IN (1,3)
No trecho de código acima, realizamos um SELECT na tabela Aluno, realizando JOINS com as tabelas turma e Status, e nas linhas 13 e 14 dizemos que a condição para essa consulta trazer algum resultado é o id do status do aluno estar entre os valores definidos pelo parênteses (1 ou 3). Os valores 1 e 3 referem-se aso status Aprovado e Aguardando nota.
O resultado da query pode ser visto na Tabela 4.
nome | Turma | Status |
João Fernando | Turma A | Aprovado |
Maria Carvalho | Turma A | Aprovado |
Bruna dos Santos | Turma B | Aguardando Nota |
Sintaxe
SELECT
[ coluna1, coluna2, ... | * ]
FROM
[ tabela ]
WHERE
[ coluna ] IN [ valor1, valor2, … | SELECT ]
Na prática
Exemplo 1
Podemos também utilizar o IN em conjunto a subqueries.
Para este exemplo considere a tabela aluno (Tabela 1) e a tabela trancamento_aluno (Tabela 5), responsável por guardar informações sobre todos os alunos que estão trancados em alguma turma.
Id_aluno | Id_turma | data_trancamento |
4 | 2 | 2018-04-01 |
5 | 1 | 2017-05-10 |
Suponhamos que seja necessário agora trazer todos os alunos da tabela aluno (Tabela 1) que estejam também na tabela trancamento_aluno. Para isso, podemos utilizar a query abaixo:
SELECT
A.nome
FROM
aluno A
WHERE
A.ID IN (
SELECT
ID_ALUNO
FROM
Trancamento_aluno T
WHERE
T.id_aluno = A.ID
)
No trecho de código acima, utilizamos o IN na linha 6 para trazer uma lista de ID de aluno que estejam na tabela trancamento_aluno, dessa forma, o resultado dessa consulta é onde será feito o filtro da consulta, ou seja, serão trazidos apenas alunos que o ID esteja presente no resultado do subselect, conforme ilustra Tabela 6.
Nome |
Pedro da Silva |
Tiago |
Exemplo 2
Para o exemplo a seguir, considere a estrutura de tabelas abaixo, onde temos a tabela projeto (Tabela 7), responsável por manter todos os projetos da empresa, e a tabela comentario (Tabela 8), responsável por manter todos os comentários referentes aos projetos cadastrados no banco de dados.
ID | Titulo | Data |
ID | Titulo | Data |
7 | Criando uma aplicação com React | 2018-04-10 |
8 | API RestFUL com Lumen | 2018-05-10 |
9 | Consumindo uma API RestFUL com Laravel | 2018-05-20 |
10 | Documentação SQL | 2018-05-21 |
ID | Comentario | Data | id_projeto |
1 | Muito legal essa aplicação! Adorei usar o React | 2018-04-10 | 7 |
2 | React é muito simples! Curti o projeto! parabéns! | 2018-05-10 | 7 |
3 | Muito top! | 2018-05-20 | 9 |
4 | Parabéns aos envolvidos! | 2018-05-20 | 9 |
5 | Muito legal, sempre gostei do Laravel. | 2018-05-20 | 9 |
6 | Interessante a forma de recuperar as informações. Não sabia. Gostei! | 2018-05-21 | 9 |
7 | Consigo fazer o mesmo com CodeIgniter? | 2018-05-22 | 9 |
8 | React é apenas JavaScript, há uma API bem pequena para aprender, apenas algumas funções e como usá-las. Depois disso, suas habilidades em JavaScript serão o que te farão um melhor desenvolvedor React | 2018-05-23 | 7 |
Suponha que seja necessário trazer todos os projetos que tenham algum comentário cadastrado. Para isso podemos utilizar a query abaixo:
SELECT
P.id,
P.titulo
FROM
projetos P
WHERE
P.id IN
(
SELECT
C.id_projeto
FROM
comentario C
WHERE
C.id_projeto = P.id
)
Observe que selecionamos o id e o titulo do projeto e logo na Linha 7 utilizamos a cláusula IN para verificar se existem valores no resultado da subquery da Linha 9. Das Linhas 9 a 14 realizamos uma subquery na tabela comentario, solicitando somente aqueles que o id do projeto seja igual ao campo id_projeto da tabela comentario.
O resultado obtido pode ser visto na abaixo, na Tabela 9:
ID | Titulo |
7 | Criando uma aplicação com React |
9 | Consumindo uma API RESTful com Laravel |
Exemplo 3
Ainda na mesma estrutura de tabelas, podemos trazer todos os projetos que não tenham comentários, fazendo assim o inverso do exemplo anterior. Para isso podemos utilizar a query abaixo:
SELECT
P.id,
P.titulo
FROM
projetos P
WHERE
P.id NOT IN
(
SELECT
C.id_projeto
FROM
comentario C
WHERE
C.id_projeto = P.id
)
Podemos ver o resultado da query abaixo, na Tabela 10.
ID | Titulo |
8 | API RestFUL com Lumen |
10 | Documentação SQL |