A cláusula INTERSECT retorna apenas as linhas resultantes da primeira e da segunda consulta. As consultas devem corresponder em número de colunas, ordem e tipo. O resultado de INTERSECT pode conter linhas duplicadas.
Várias instruções INTERSECT são executadas da esquerda para a direita se os parênteses não forem especificados. O operador INTERSECT tem prioridade mais alta que as cláusulas UNION e EXCEPT.
SELECT column1 [, column2 ]
FROM table1
[WHERE condition]
INTERSECT
SELECT column1 [, column2 ]
FROM table2
[WHERE condition]
A condição pode ser qualquer expressão, dependendo dos seus requisitos.
Veja um exemplo simples que faz a interseção dos números de 1 a 10 com os números de 3 a 8:
SELECT number FROM numbers(1,10) INTERSECT SELECT number FROM numbers(3,8);
┌─number─┐
│ 3 │
│ 4 │
│ 5 │
│ 6 │
│ 7 │
│ 8 │
└────────┘
INTERSECT é útil quando você tem duas tabelas que compartilham uma ou mais colunas. É possível fazer a interseção dos resultados de duas consultas, desde que eles contenham as mesmas colunas. Por exemplo, suponha que tenhamos alguns milhões de linhas de dados históricos de criptomoedas contendo preços de negociação e volume:
CREATE TABLE crypto_prices
(
trade_date Date,
crypto_name String,
volume Float32,
price Float32,
market_cap Float32,
change_1_day Float32
)
ENGINE = MergeTree
PRIMARY KEY (crypto_name, trade_date);
INSERT INTO crypto_prices
SELECT *
FROM s3(
'https://learn-clickhouse.s3.us-east-2.amazonaws.com/crypto_prices.csv',
'CSVWithNames'
);
SELECT * FROM crypto_prices
WHERE crypto_name = 'Bitcoin'
ORDER BY trade_date DESC
LIMIT 10;
┌─trade_date─┬─crypto_name─┬──────volume─┬────price─┬───market_cap─┬──change_1_day─┐
│ 2020-11-02 │ Bitcoin │ 30771456000 │ 13550.49 │ 251119860000 │ -0.013585099 │
│ 2020-11-01 │ Bitcoin │ 24453857000 │ 13737.11 │ 254569760000 │ -0.0031840964 │
│ 2020-10-31 │ Bitcoin │ 30306464000 │ 13780.99 │ 255372070000 │ 0.017308505 │
│ 2020-10-30 │ Bitcoin │ 30581486000 │ 13546.52 │ 251018150000 │ 0.008084608 │
│ 2020-10-29 │ Bitcoin │ 56499500000 │ 13437.88 │ 248995320000 │ 0.012552661 │
│ 2020-10-28 │ Bitcoin │ 35867320000 │ 13271.29 │ 245899820000 │ -0.02804481 │
│ 2020-10-27 │ Bitcoin │ 33749879000 │ 13654.22 │ 252985950000 │ 0.04427984 │
│ 2020-10-26 │ Bitcoin │ 29461459000 │ 13075.25 │ 242251000000 │ 0.0033826586 │
│ 2020-10-25 │ Bitcoin │ 24406921000 │ 13031.17 │ 241425220000 │ -0.0058658565 │
│ 2020-10-24 │ Bitcoin │ 24542319000 │ 13108.06 │ 242839880000 │ 0.013650347 │
└────────────┴─────────────┴─────────────┴──────────┴──────────────┴───────────────┘
Agora, suponha que temos uma tabela chamada holdings que contém uma lista das criptomoedas que possuímos, junto com a quantidade de moedas:
CREATE TABLE holdings
(
crypto_name String,
quantity UInt64
)
ENGINE = MergeTree
PRIMARY KEY (crypto_name);
INSERT INTO holdings VALUES
('Bitcoin', 1000),
('Bitcoin', 200),
('Ethereum', 250),
('Ethereum', 5000),
('DOGEFI', 10);
('Bitcoin Diamond', 5000);
Podemos usar INTERSECT para responder a perguntas como “Quais moedas temos que foram negociadas a um preço acima de $100?”:
SELECT crypto_name FROM holdings
INTERSECT
SELECT crypto_name FROM crypto_prices
WHERE price > 100
┌─crypto_name─┐
│ Bitcoin │
│ Bitcoin │
│ Ethereum │
│ Ethereum │
└─────────────┘
Isso significa que, em algum momento, Bitcoin e Ethereum foram negociados acima de US100,eDOGEFIeBitcoinDiamondnuncaforamnegociadosacimadeUS 100 (pelo menos com base nos dados deste exemplo).
Observe que, na consulta anterior, tínhamos várias posições de Bitcoin e Ethereum negociadas acima de $100. Pode ser útil remover linhas duplicadas, já que elas apenas repetem o que já sabemos. Você pode adicionar DISTINCT a INTERSECT para eliminar linhas duplicadas do resultado:
SELECT crypto_name FROM holdings
INTERSECT DISTINCT
SELECT crypto_name FROM crypto_prices
WHERE price > 100;
┌─crypto_name─┐
│ Bitcoin │
│ Ethereum │
└─────────────┘
Veja também
Última modificação em 10 de junho de 2026