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 email 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
Tabela 1. Estrutura da tabela aluno
id status
1 Aprovado
2 Reprovado
3 Aguardando nota
4 Abandono
5 Trancado
Tabela 2. Estrutura da tabela status
id nome
1 Turma A
2 Turma B
3 Turma C
Tabela 3. Estrutura da tabela Turma

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
Tabela 4. Todos alunos que ainda estão em curso

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
Tabela 5. Tabela trancamento_aluno

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
Tabela 6. Alunos que estão trancados e presentes na tabela trancamento_aluno

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
Tabela 7. Estrutura da tabela projeto
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
Tabela 8. Estrutura da tabela comentario

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
Tabela 9. Lista de projetos com comentários

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
Tabela 10. Lista de projetos sem comentários

Confira também