sql >> Databáze >  >> RDS >> Mysql

MYSQL - Vytvořte jeden SQL dotaz z více dotazů

Technika 1:Kombinace skalárů:

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

-->

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

Pokud a je něco jako COUNT(*) , pak víte, že bude přesně jeden výsledek; proto LIMIT 1 je zbytečné.

Pokud jeden z těchto poddotazů nemusí vrátit žádné řádky, dostanete NULL .

Technika 2:Select lze použít téměř všude, kde lze použít výraz. Výše uvedené je technicky příkladem takového. Také...

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

Aby to bylo možné, musí poddotaz opět vrátit jeden řádek.

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

Po vyhodnocení dílčího dotazu to bude něco podobného:

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

(Není to efektivní, ale funguje to.)

Tyto 3 jsou podobné, ale ne nutně účinné:

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

Toto je podobné, ale najde odpovídající položky, které chybějí od B:

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

UNION by měl být použit pro dotazy, které mají podobný výstup:

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

To vytvoří libovolný počet řádků z A a libovolný počet řádků z B. Pokud použijete UNION DISTINCT, budou duplikáty odstraněny. , nebo ponecháno, pokud používáte UNION ALL .

ORDER BY ... LIMIT ... se stává záludným. OFFSET je ještě složitější.

Výkon

Tyto položky jsou pravděpodobně důležitější (pro výkon) než kombinace prohlášení dohromady. Viz https://meta.stackexchange.com/questions/ 66377/co-je-xy-problém



  1. MongoDB jako mezipaměť pro časté spojování a dotazy z MySQL

  2. MySQL přeskakuje první řádek

  3. Kartézské součiny a výběry v klauzuli od

  4. Jak vypočítám průběžný součet v SQL bez použití kurzoru?