sql >> Base de Datos >  >> RDS >> Mysql

MYSQL:crea una consulta sql única a partir de varias consultas

Técnica 1:Combinar escalares:

SELECT a ... LIMIT 1;
SELECT b ... LIMIT 1;

-->

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

Si a es algo así como COUNT(*) , entonces sabes que habrá exactamente un resultado; de ahí el LIMIT 1 es innecesario.

Si una de esas subconsultas no devuelve ninguna fila, obtendrá NULL .

Técnica 2:se puede usar una selección en casi cualquier lugar donde se pueda usar una expresión. Lo anterior es, técnicamente, un ejemplo de ello. También...

SELECT ... WHERE x = ( SELECT ... ) ...

Nuevamente, la subconsulta debe devolver una sola fila para que eso sea posible.

SELECT ...
    WHERE x LIKE CONCAT('%', ( SELECT ... ), '%')
    ...;

Eso se convierte en algo como esto después de evaluar la subconsulta:

SELECT
    WHERE x LIKE '%foo%'
    ...;

(No es eficiente, pero funciona).

Estos 3 son similares, pero no necesariamente eficientes entre sí:

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

Esto es similar pero encuentra los elementos coincidentes que faltan de B:

SELECT ... FROM A LEFT JOIN B ON B.x = A.x
    WHERE B.id IS NULL
    

UNION debe usarse para consultas que tienen un resultado similar:

SELECT x,y FROM A
UNION
SELECT x,y FROM B

Eso producirá cualquier cantidad de filas de A y cualquier cantidad de filas de B. Los duplicados se eliminan si usa UNION DISTINCT , o guardado si usa UNION ALL .

ORDER BY ... LIMIT ... se vuelve complicado OFFSET se vuelve aún más complicado.

Rendimiento

Esos elementos son probablemente más importante (para el desempeño) que combinar las declaraciones. Consulte https://meta.stackexchange.com/questions/ 66377/cuál-es-el-problema-xy