разница существует в MySQL и воспроизвели первоначальную связь: https: //blog.csdn.net/zhenwei1994/article/details/82145711

 

1, используйте:

(1) Использование EXISTS

выберите a.batchName, a.projectId из ucsc_project_batch а где EXISTS (выбрать b.id из ucsc_project б, где a.projectId = b.id)

 

SQL-выше это означает: чтобы ucsc_project_batch основного BatchName таблица запроса и поле ProjectID, который существует ProjectID поля в ucsc_project таблицы.

EXISTS будет выглядеть ucsc_project_batch циркулировать, которые соответствуют запросу, это не имеет значения в детской таблице за возвращением запроса, какое значение существует только заботу о возвращаемом значении, есть возвращаемое значение, то условие истинно, то успех соответствия статьи данных, добавление результатов запроса концентрировал, не возвращаемого значения, если условие ложно, то данные отбрасываются статья.

Такие, как меняется внезапно мы здесь на полях возвращает запрос, не влияет на результаты запроса вне запроса:

выберите a.batchName, a.projectId из ucsc_project_batch а, где существует (выберите b.companyId, b.name из ucsc_project б, где a.projectId = b.id)

 

(2) в использовании

выберите a.batchName, a.projectId из ucsc_project_batch а где a.projectId в (выбрать b.id из ucsc_project б)

 

Над этим SQL результатов запроса с результатами СУЩЕСТВУЕТ точно такие же, смысл тот же самый запрос.

2, отмечает:

(1) EXISTS апишите условный оператор подзапросу вообще нужно сделать, чтобы забалансовые связанный лист запросов, подзапросы условие в противном случае могло бы быть истинным, ложным или был, осуществляется, когда лист запросы сопоставления цикла, либо все проверить вне, или нет.

выберите a.batchName, a.projectId из ucsc_project_batch а где EXISTS (выбрать b.id из ucsc_project б)

Формулировка указанного выше пример, так как таблица значения ucsc_project существует, то условие подзапроса было верно, ucsc_project_batch совпадает каждый раз, когда цикл данных, может соответствовать успеху, проверить результаты стали ucsc_project_batch всех данных таблицы.

 

выберите a.batchName, a.projectId из ucsc_project_batch а, где существует (выберите b.id из ucsc_project б, где b.id равно нулю)

Формулировка подзапросов не узнать результаты, поэтому условие подзапроса является ложным, соответствие каждого фрагмента данных вне запроса не удается, весь результат запроса пуст

 

(2) В заявлении не ограничивает количество параметров в MySQL, но MySQL SQL оператор, имеющий ограничения на размер длины, в целом к ​​4М

Что (3) EXISTS подзапрос является запросом не волнует, только забота о нет результирующего набора не существует, то есть все подзапросы можно рассматривать как условное утверждение верно, или является условием для ложного заявления

(4) В заявлении, чтобы вернуться на поле только суб-запросы, или будет ошибка:

выберите a.batchName, a.projectId из ucsc_project_batch а где a.projectId в (выбрать b.id, b.companyId из ucsc_project б)

[Err] 1241 - Операнд должен содержать 1 колонку (ы)

3, выбор сцены

Смотри таблица вне большой, маленький суб-таблицы поиска, выберите IN, небольшие поисковые таблицы снаружи, большой суб-таблицы поиска, выберите EXISTS, если две таблицы примерно одинакового размера, то же самое.

(1) В запросе в SQL-запрос только один раз, а затем временный файл существует в наборе результатов, а затем наружное сопоставление запросов SQL, отличающееся тем, что внешний запрос с индексом может быть использованы подзапросами

выберите a.batchName, a.projectId из ucsc_project_batch а где a.projectId в (выбрать b.id из ucsc_project б)

 

Это эквивалентно:

Результат = $ [];
$ ucsc_project_batch = "ВЫБОР a.batchName, a.projectId от ucsc_project_batch А";
$ ucsc_project = "ВЫБОР b.id от ucsc_project B",
для ($ I = 0; $ I <$ ucsc_project_batch .length ; $ I ++) {
для ($ J = 0; $ J <$ ucsc_project .length; $ J ++) {
IF ($ ucsc_project_batch [$ я] == $ .projectId ucsc_project [$ J] .id) {
$ Результат [] ucsc_project_batch $ = [$ I];
BREAK;
}

(2) внешняя EXISTS запрос таблицы будет циркулировать ucsc_project_batch согласования выполняется ucsc_project_batch.length вида, подзапросы могут быть использованы , в котором индекс, внешний запрос полной сканирования таблицы

выберите a.batchName, a.projectId из ucsc_project_batch а где EXISTS (выбрать b.id из ucsc_project б, где a.projectId = b.id)

 

Это эквивалентно:

Результат = $ [];
$ ucsc_project_batch = "ВЫБОР a.batchName, a.projectId от ucsc_project_batch А",
для ($ I = 0; $ I <$ длина ucsc_project_batch ;. $ I ++) {
IF (EXISTS ($ ucsc_project_batch [$ . я] ProjectID)) {// Выполнить b.id из ucsc_project в , где ВЫБРАТЬ = a.projectId b.id
$ Результат [] = $ ucsc_project_batch [$ I];
}
}
на два анализа псевдо-кода найдено: подзапросов когда большой стол, использование EXISTS может эффективно уменьшить общее количество циклов , чтобы увеличить скорость, когда большие таблицы , когда внешний запрос, используя в может эффективно уменьшить внешний контур с помощью таблицы поиска , чтобы улучшить скорость.
----------------
Отказ от ответственности: Эта статья CSDN блоггер «Хуай девятнадцать оригинал статьи месяцев, следовать CC 4.0 BY-SA авторского соглашения, воспроизведены, пожалуйста , приложите ссылку первоисточника и это утверждение.

 

рекомендация

отwww.cnblogs.com/syj789/p/12517433.html