sql >> Database >  >> RDS >> Mysql

MYSQL - Maak een enkele SQL-query van meerdere query's

Techniek 1:Combineren van scalairen:

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

-->

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

Als a is zoiets als COUNT(*) , dan weet je dat er precies één resultaat zal zijn; vandaar de LIMIT 1 is niet nodig.

Als een van die subquery's mogelijk geen rijen retourneert, krijgt u NULL .

Techniek 2:Een select kan bijna overal worden gebruikt waar een uitdrukking kan worden gebruikt. Het bovenstaande is, technisch gezien, daar een voorbeeld van. Ook...

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

Nogmaals, de subquery moet een enkele rij retourneren om dat mogelijk te maken.

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

Dat wordt ongeveer dit nadat de subquery is geëvalueerd:

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

(Het is niet efficiënt, maar het werkt.)

Deze 3 zijn vergelijkbaar, maar niet noodzakelijk efficiënt als elkaar:

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

Dit is vergelijkbaar, maar vindt de overeenkomende items die ontbrekende van B:

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

UNION moet worden gebruikt voor zoekopdrachten met vergelijkbare uitvoer:

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

Dat levert een willekeurig aantal rijen van A en een willekeurig aantal rijen van B op. Duplicaten worden verwijderd als u UNION DISTINCT gebruikt , of bewaard als u UNION ALL . gebruikt .

ORDER BY ... LIMIT ... wordt lastig. OFFSET wordt nog lastiger.

Prestaties

Die items zijn waarschijnlijk belangrijker (voor de prestatie) dan het samenvoegen van de uitspraken. Zie https://meta.stackexchange.com/questions/ 66377/wat-is-het-xy-probleem



  1. FOUT 1215:Kan geen externe sleutelbeperking toevoegen bij gebruik van ON DELETE SET NULL

  2. FOUT:nul-lengte gescheiden identifier op of nabij LINE 1:DELETE FROM regionen WHERE regionen. =$1

  3. Meerdere tellingen en een groep op

  4. unieke beperking op Bytea-gegevenstype op Postgresql