Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MYSQL - Crie uma única consulta sql a partir de várias consultas


Técnica 1:Combinando escalares:
SELECT a ... LIMIT 1;
SELECT b ... LIMIT 1;

-->

SELECT
    ( SELECT a ... LIMIT 1) AS a,
    ( SELECT b ... LIMIT 1) AS b ;

Se a é algo como COUNT(*) , então você sabe que haverá exatamente um resultado; daí o LIMIT 1 é desnecessário.

Se uma dessas subconsultas não retornar nenhuma linha, você obterá NULL .

Técnica 2:Um select pode ser usado em quase qualquer lugar em que uma expressão possa ser usada. O acima é, tecnicamente, um exemplo disso. Também...
SELECT ... WHERE x = ( SELECT ... ) ...

Novamente, a subconsulta deve retornar uma única linha para tornar isso possível.
SELECT ...
    WHERE x LIKE CONCAT('%', ( SELECT ... ), '%')
    ...;

Isso se torna algo assim depois que a subconsulta é avaliada:
SELECT
    WHERE x LIKE '%foo%'
    ...;

(Não é eficiente, mas funciona.)

Estes 3 são semelhantes, mas não necessariamente eficientes entre si:
SELECT ...
    WHERE x IN ( SELECT ... )

SELECT ... FROM A
    WHERE EXISTS( SELECT ... FROM B
                  WHERE B.x = A.x )

SELECT ... FROM A JOIN B ON B.x = A.x

Isso é semelhante, mas encontra os itens correspondentes que estão ausentes de B:
SELECT ... FROM A LEFT JOIN B ON B.x = A.x
    WHERE B.id IS NULL
    

UNION deve ser usado para consultas que têm saída semelhante:
SELECT x,y FROM A
UNION
SELECT x,y FROM B

Isso produzirá qualquer número de linhas de A e qualquer número de linhas de B. As duplicatas serão removidas se você usar UNION DISTINCT , ou mantido se você usar UNION ALL .

ORDER BY ... LIMIT ... fica complicado. OFFSET fica ainda mais complicado.

Desempenho

Esses itens são provavelmente mais importante (para o desempenho) do que combinar as declarações. Consulte https://meta.stackexchange.com/questions/ 66377/qual-é-o-problema-xy