Mysql
 sql >> база данни >  >> RDS >> Mysql

MYSQL - Създаване на единична sql заявка от множество заявки

Техника 1:Комбиниране на скалари:

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

-->

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

Ако a е нещо като COUNT(*) , тогава знаете, че ще има точно един резултат; следователно LIMIT 1 е ненужен.

Ако една от тези подзаявки може да не върне никакви редове, тогава получавате NULL .

Техника 2:Select може да се използва почти навсякъде, където може да се използва израз. Горното е технически пример за такъв. Освен това...

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

Отново подзаявката трябва да върне един ред, за да стане това възможно.

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

Това става нещо подобно, след като подзаявката бъде оценена:

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

(Не е ефективно, но работи.)

Тези 3 са сходни, но не непременно ефективни един от друг:

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

Това е подобно, но намира съответстващите елементи, които липсват от B:

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

UNION трябва да се използва за заявки, които имат подобен резултат:

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

Това ще произведе произволен брой редове от A и произволен брой редове от B. Дубликатите се премахват, ако използвате UNION DISTINCT , или се запазва, ако използвате UNION ALL .

ORDER BY ... LIMIT ... става трудно. OFFSET става още по-сложно.

Ефективност

  • Избягвайте IN ( SELECT ...) обикновено е по-бавният от трите.
  • Избягвайте водещи заместващи знаци в LIKE; вижте дали FULLTEXT би било по-добър вариант.
  • INDEX(path) , INDEX(parent_id, child_id) ("покриване"), INDEX(scope, path, scope_id); може би други, но трябва да видя SHOW CREATE TABLE .
  • Избягвайте EAV схема; това е лошо за производителността. Добавих линк; вижте много други дискусии. Също така:http://mysql.rjweb.org/doc.php/eav и http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta

Тези елементи са вероятно по-важно (за производителността) от комбинирането на изявленията заедно. Вижте https://meta.stackexchange.com/questions/ 66377/what-is-the-xy-problem



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CONCAT колони с Laravel 5 eloquent

  2. Mysql - Групиране по месеци с формат Y-m-d

  3. mysql подреждане по проблем

  4. Транзакциите на PhalconPHP база данни се провалят на сървъра

  5. Как мога да групирам поле с помощта на mysql?