Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MYSQL - Utwórz pojedyncze zapytanie sql z wielu zapytań

Technika 1:Łączenie skalarów:

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

-->

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

Jeśli a to coś w stylu COUNT(*) , wtedy wiesz, że będzie dokładnie jeden wynik; stąd LIMIT 1 jest niepotrzebne.

Jeśli jedno z tych podzapytań może nie zwrócić żadnych wierszy, otrzymasz NULL .

Technika 2:Select może być używany prawie wszędzie, gdzie można użyć wyrażenia. Powyższe jest technicznie przykładem takiego. Również...

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

Ponownie, podzapytanie musi zwrócić pojedynczy wiersz, aby było to możliwe.

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

To wygląda mniej więcej tak po przeanalizowaniu podzapytania:

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

(Nie jest wydajny, ale działa.)

Te 3 elementy są podobne, ale niekoniecznie wydajne:

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

Działa podobnie, ale znajduje pasujące elementy, których brakuje od B:

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

UNION powinno być używane dla zapytań, które mają podobny wynik:

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

Spowoduje to utworzenie dowolnej liczby wierszy z A i dowolnej liczby wierszy z B. Duplikaty zostaną usunięte, jeśli użyjesz UNION DISTINCT , lub zachowane, jeśli używasz UNION ALL .

ORDER BY ... LIMIT ... staje się trudny. OFFSET staje się jeszcze trudniejsze.

Wydajność

Te elementy są prawdopodobnie ważniejsze (dla wydajności) niż łączenie ze sobą stwierdzeń. Zobacz https://meta.stackexchange.com/questions/ 66377/co-jest-xy-problemem



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. node.js + łączenie połączeń mysql

  2. kolejność wierszy podczas wstawiania wielu wierszy w MySQL

  3. Jak uzyskać podobną wartość w Oracle

  4. Kursor w Mysql ma inne prawa niż użytkownik?

  5. mysql match/przeciwko