План выполнения движка SQL HAVING vs (подзапрос) WHERE

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

1
задан David542 4 April 2019 в 23:51
поделиться

1 ответ

Практически в любой другой базе данных они будут эквивалентны. Для краткости HAVING обычно является лучшим выбором.

По крайней мере исторически, MySQL материализовал подзапросы. Итак, этот запрос:

SELECT * 
FROM (SELECT name, count(*) as cnt
      FROM mytable
      GROUP BY name
     ) x 
WHERE cnt > 1;

предполагает, что он собирается выписать производную таблицу, а затем повторно отсканировать ее для окончательного WHERE> However, this makes little difference to performance because the GROUP BY` уже читает и записывает данные. 116]

Таким образом, эти запросы, вероятно, очень похожи по производительности на MySQL. И они будут иметь тот же план выполнения практически в любой другой базе данных. Предложение HAVING приводит к более простому запросу.

0
ответ дан Gordon Linoff 4 April 2019 в 23:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: