sql >> Database teknologi >  >> RDS >> Mysql

MYSQL - Opret enkelt sql-forespørgsel fra flere forespørgsler

Teknik 1:Kombination af skalarer:

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

-->

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

Hvis a er noget i stil med COUNT(*) , så ved du, at der bliver præcis ét resultat; derfor LIMIT 1 er unødvendigt.

Hvis en af ​​disse underforespørgsler måske ikke returnerer nogen rækker, får du NULL .

Teknik 2:En select kan bruges næsten overalt, hvor et udtryk kan bruges. Ovenstående er teknisk set et eksempel herpå. Også...

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

Igen skal underforespørgslen returnere en enkelt række for at gøre det muligt.

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

Det bliver sådan noget, efter at underforespørgslen er evalueret:

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

(Det er ikke effektivt, men det virker.)

Disse 3 ligner hinanden, men er ikke nødvendigvis effektive:

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

Dette ligner, men finder de matchende elementer, der mangler fra B:

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

UNION skal bruges til forespørgsler, der har lignende output:

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

Det vil producere et hvilket som helst antal rækker fra A og et hvilket som helst antal rækker fra B. Dubletter fjernes, hvis du bruger UNION DISTINCT , eller beholdes, hvis du bruger UNION ALL .

ORDER BY ... LIMIT ... bliver tricky. OFFSET bliver endnu sværere.

Ydeevne

Disse elementer er sandsynligvis vigtigere (for præstationen) end at kombinere udsagnene sammen. Se https://meta.stackexchange.com/questions/ 66377/what-is-the-xy-problem



  1. MySQL fjerner duplikerede rækker

  2. Flyway flere metadatatabeller i ét skema

  3. PostgreSQL delvist unikt indeks og upsert

  4. Hvordan får man en kolonne med mysql_query-resultater ind i et array?