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

Ляво присъединяване или избор от множество таблици с помощта на запетая (,)

На първо място, за да бъде напълно еквивалентна, първата заявка трябва да бъде написана

   SELECT mw.*, 
          nvs.* 
     FROM mst_words mw 
LEFT JOIN (SELECT *
             FROM vocab_stats 
            WHERE owner = 1111) AS nvs ON mw.no = nvs.vocab_no 
    WHERE (nvs.correct > 0 ) 
      AND mw.level = 1

Така че mw.* и nvs.* заедно произвеждат същия набор като единственото число * на втората заявка. Заявката, както сте написали, може да използва INNER JOIN, тъй като включва филтър на nvs.correct.

Общата форма

TABLEA LEFT JOIN TABLEB ON <CONDITION>

attempts за да намерите записи TableB въз основа на условието. Ако не успее, резултатите от TABLEA се запазват, като всички колони от TableB са зададени на NULL. За разлика от това

TABLEA INNER JOIN TABLEB ON <CONDITION>

също attempts за да намерите записи TableB въз основа на условието. Въпреки това , когато не успее, конкретният запис от TableA се премахва от изходния набор от резултати.

Стандартът ANSI за CROSS JOIN създава Картезиански продукт между двете маси.

TABLEA CROSS JOIN TABLEB
  -- # or in older syntax, simply using commas
TABLEA, TABLEB

Намерението на синтаксиса е ВСЕКИ ред в TABLEA да се присъедини към ВСЕКИ ред в TABLEB. Така че 4 реда в A и 3 реда в B произвеждат 12 реда изход. Когато се сдвоява с условия в клаузата WHERE, понякога произвежда същото поведение на INNER JOIN, тъй като те изразяват едно и също нещо (условие между A и B => запазване или не). Въпреки това е много по-ясно, когато четете за намерението, когато използвате INNER JOIN вместо запетаи.

По отношение на производителността, повечето СУБД ще обработват LEFT JOIN по-бързо от INNER JOIN. Нотацията със запетая може да накара системите за бази данни да тълкуват погрешно намерението и да произведат лош план за заявка – така че още един плюс за нотацията SQL92.

Защо ни трябва LEFT JOIN? Ако обяснението на LEFT JOIN по-горе все още не е достатъчно (съхранявайте записи в A без съвпадения в B), тогава помислете, че за да постигнете същото, ще ви трябва сложен UNION между два набора, използвайки старата нотация със запетая, за да постигнете същия ефект . Но както беше посочено по-горе , това не се отнася за вашия пример, който всъщност е ВЪТРЕШНО ПРИСЪЕДИНЕНИЕ, което се крие зад ЛЯВО ПРИЕДИНЕНИЕ.

Бележки:

  • RIGHT JOIN е същото като LEFT, с изключение на това, че започва с TABLEB (дясна страна) вместо A.
  • ДЯСНО и ЛЯВО ПРИСЪЕДИНЕНИ са и двете ВЪНШНИ съединения. Думата OUTER е по избор, т.е. може да бъде написана като LEFT OUTER JOIN .
  • Третият тип OUTER присъединяване е FULL OUTER присъединяване, но това не се обсъжда тук.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво разрешение е необходимо за потребител на MySQL, за да създаде база данни?

  2. Как да извлека JSON данни от MySQL?

  3. Как да активирам автоматично повторно свързване на MySQL клиент с MySQLdb?

  4. използването на инструкция mysql LOAD в PHP се проваля, но това чрез команден ред работи

  5. MySQL:Добавете колона за последователност въз основа на друго поле