Имя Sqlite и использовать временное выражение - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь понять этот код из: Стандартное отклонение для SQLite .

create table t (row int);
insert into t values (1),(2),(3);
SELECT AVG((t.row - sub.a) * (t.row - sub.a)) as var from t, 
    (SELECT AVG(row) AS a FROM t) AS sub;
0.666666666666667

Он вычисляет дисперсию заданных значений (я знаю, что это не таквычислить непредвзятую оценку, это не оспаривается).

Мне трудно искать "Sqlite AS" в поисковых системах, как вы можете себе представить ... пожалуйста, предложите лучшие условия поиска, если вы их знаете.В любом случае, как это выражение анализируется?Я не знаком с тем, чтобы ставить запятые между операторами выбора, такими как

SELECT ..., SELECT ...;

Чтобы выражение имело смысл, необходимо определить sub.a, прежде чем можно будет выполнить первый оператор выбора.Означает ли это, что Sqlite анализирует эти утверждения справа налево?Или он анализирует слева направо, а затем понимает, что второй должен быть оценен первым?Меня также смущает, почему sub не печатается.Являются ли результаты

SELECT ..., SELECT ...;

только результатом первого оператора выбора?

1 Ответ

0 голосов
/ 04 февраля 2019

Поможет ли увидеть код, написанный таким образом?

SELECT AVG((t.row - sub.a) * (t.row - sub.a)) as var
FROM t CROSS JOIN
     (SELECT AVG(row) AS a FROM t) sub;

, - это CROSS JOIN., - по стандартам SQL - архаичный синтаксис.Явный JOIN существует уже несколько десятилетий и настоятельно рекомендуется.

AS используется для определения псевдонимов, но является необязательным.Я использую его только для псевдонимов столбцов - то есть, давая выражению имя в SELECT.Он также используется для указания имен таблиц / подзапросов в предложении FROM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...