Subconsulta retorna uma tabela
E por fim, a terceira opção é quando a subconsulta retorna a tabela inteira. Esta é a opção mais comum.
Muitas vezes, há situações em que queremos ajustar um pouco uma determinada mesa. E só então junte (usando o operador JOIN ON) a tabela corrigida com outra.
Vamos começar com o caso mais simples, onde juntamos duas tabelas com um JOIN:
SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id
E como você provavelmente se lembra, existem tarefas na tabela de tarefas que não são atribuídas a ninguém: employee_id é NULL .
Vamos gerar uma tabela corrigida , onde atribuímos todas as tarefas pendentes ao diretor (seu ID = 4).
Para fazer isso, usamos a função IFNULL() :
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task
E o resultado desta consulta:
eu ia | ID do Empregado | nome | prazo final |
---|---|---|---|
1 | 1 | Corrigir um bug no front-end | 01/06/2022 |
2 | 2 | Corrigir um bug no back-end | 15/06/2022 |
3 | 5 | comprar café | 01/07/2022 |
4 | 5 | comprar café | 01/08/2022 |
5 | 5 | comprar café | 01/09/2022 |
6 | 4 | Limpe o escritório | (NULO) |
7 | 4 | Aproveite a vida | (NULO) |
8 | 6 | Aproveite a vida | (NULO) |
A célula corrigida é marcada em vermelho.
Agora vamos substituir nossa tabela corrigida na consulta:
SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id
Em vez da tabela de tarefas .
Tal solicitação seria mais ou menos assim:
SELECT * FROM employee e JOIN (
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline
FROM task
) t ON e.id = t.emploee_id
Em vez da palavra task , escrevemos parênteses e colocamos o corpo da solicitação neles.
A propósito, o alias t (alias) para a consulta aninhada foi muito útil. Uma consulta aninhada, ao contrário de uma tabela, não tem seu próprio nome, então o alias está muito fora de lugar.
E aqui está o resultado de tal consulta:
eu ia | nome | ocupação | salário | idade | data de afiliação | eu ia | ID do Empregado | nome |
---|---|---|---|---|---|---|---|---|
1 | Ivanov Ivan | Programador | 100000 | 25 | 30/06/2012 | 1 | 1 | Corrigir um bug no front-end |
2 | Petrov Petr | Programador | 80000 | 23 | 12/08/2013 | 2 | 2 | Corrigir um bug no back-end |
4 | Rabinovich Moisha | Diretor | 200000 | 35 | 2015-05-12 | 6 | 4 | Limpe o escritório |
4 | Rabinovich Moisha | Diretor | 200000 | 35 | 2015-05-12 | 7 | 4 | Aproveite a vida |
5 | Kirienko Anastácia | Gerente | 40000 | 25 | 2015-10-10 | 4 | 5 | comprar café |
5 | Kirienko Anastácia | Gerente | 40000 | 25 | 2015-10-10 | 5 | 5 | comprar café |
5 | Kirienko Anastácia | Gerente | 40000 | 25 | 2015-10-10 | 3 | 5 | comprar café |
6 | Vaska | gato | 1000 | 3 | 2018-11-11 | 8 | 6 | Aproveite a vida |
Nosso diretor tem a função de “limpar o escritório”, acho que ele encontrará rapidamente alguém para quem delegar :) Usando a instrução WITH
A propósito, a partir da versão 8 do MySQL, você não precisa mais colocar todas as suas subconsultas dentro da consulta final. Eles podem ser executados separadamente. Para isso, a instrução WITH é usada .
Ele permite criar uma tabela virtual (chamada consulta) e sua aparência é dada por um template:
WITH Name AS (request)
Muitas vezes, sua subconsulta tem colunas sem nome, como COUNT(*), às quais você não atribuiu um nome exclusivo. Nesse caso, a instrução WITH tem a opção de especificar novos nomes de colunas para a subconsulta.
Sua segunda forma é dada pelo modelo:
WITH Name(column1, column2, …) AS (request)
Você pode usar quantas tabelas virtuais (consultas nomeadas) quiser e fazer referência umas às outras nelas. A forma geral do seu pedido terá algo assim:
WITH name1 AS (request1),
name2 AS (request2),
name3 AS (request3)
SELECT * FROM name1 JOIN name2 ON …
Agora vamos pegar nossa consulta assustadora:
SELECT * FROM employee e JOIN (
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline
FROM task
) t ON e.id = t.emploee_id
E reescreva-o usando a instrução WITH:
WITH task2(id, employee_id, name, deadline)
AS (SELECT id, IFNULL(employee_id, 4), name, deadline FROM task)
SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id
Ou você pode fazer sem nomes de coluna, mas terá que especificar um alias para a função IFNULL():
WITH task2 AS (
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task
)
SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id
GO TO FULL VERSION