Я являюсь совершенно новым в SQL, но скажем, что на Проводнике Данных StackExchange, я просто хочу перечислить лучшие 15 пользователей репутацией, и я записал что-то вроде этого:
SELECT TOP 15
DisplayName, Id, Reputation, Reputation/1000 As RepInK
FROM
Users
WHERE
RepInK > 10
ORDER BY Reputation DESC
В настоящее время это дает Error: Invalid column name 'RepInK'
, который имеет смысл, я думаю, потому что RepInK
не столбец в Users
. Я могу легко зафиксировать это путем высказывания WHERE Reputation/1000 > 10
, по существу повторение формулы.
Таким образом, вопросы:
RepInK
"столбец" в WHERE
пункт? SELECT/WHERE
запрос на нем?Reputation/1000
, таким образом, я только должен повторить имена в нескольких местах вместо формулы? Могу ли я использовать столбец RepInK " "в предложении WHERE?
Нет, но вы можете быть уверены, что ваша база данных будет оценивать (Репутация / 1000)
один раз, даже если вы используете оба значения в полях SELECT
и в разделе WHERE
.
Может быть, мне нужно создать виртуальную таблицу / представление с этим столбцом, а затем выполнить для него запрос SELECT / WHERE?
Да, представление - это один из вариантов упрощения сложных запросов.
Могу я назвать выражение, напримерReputation / 1000, поэтому мне нужно только повторить имена в нескольких местах вместо формулы?
Вы можете создать определяемую пользователем функцию, которую вы можете вызвать примерно так convertToK
, которая получит репутацию value в качестве аргумента и возвращает этот аргумент, разделенный на 1000. Однако это часто нецелесообразно для тривиального случая, такого как в вашем примере.
Есть ли краткая таблица SQL, глоссарий терминов, спецификация языка, что-нибудь, что я могу использовать, чтобы быстро понять синтаксис и семантику языка?
Я предлагаю попрактиковаться. Вы можете начать следовать тегу mysql в Stack Overflow, где каждый день задают множество вопросов новичкам. Загрузите MySQL , и когда вы думаете, что вопрос в пределах вашей досягаемости, попробуйте найти решение. Думаю, это поможет вам набрать скорость, а также познакомиться с особенностями языков. Сначала нет необходимости публиковать ответ, потому что здесь есть несколько довольно быстрых орудий по этой теме, но с некоторой практикой, я уверен, вы сможете донести до дома некоторые моменты :)
Я понимаю, что там есть разные «разновидности»?
На самом деле разновидности являются расширениями ANSI SQL . Поставщики баз данных обычно дополняют язык SQL такими расширениями, как Transact-SQL и PL / SQL .
Что касается чего-то вроде именованных выражений, то, хотя существует несколько возможных альтернатив, оптимизатору запроса лучше всего просто записать формулу Репутация / 1000
от руки. Если вам действительно нужно выполнить целую группу запросов, используя одно и то же оцениваемое значение, лучше всего создать представление с определенным полем, но вы не захотите делать это для одноразового запроса.
В качестве альтернативы (и в случаях, когда производительность не является большой проблемой), вы можете попробовать что-то вроде:
SELECT TOP 15
DisplayName, Id, Reputation, RepInk
FROM (
SELECT DisplayName, Id, Reputation, Reputation / 1000 as RepInk
FROM Users
) AS table
WHERE table.RepInk > 10
ORDER BY Reputation DESC
хотя я не уверен, что это поддерживается всеми диалектами SQL, и, опять же, оптимизатор, скорее всего, будет работать намного хуже (поскольку он будет выполнять SELECT по всей таблице Users, а затем фильтровать результат). Тем не менее, для некоторых ситуаций такой запрос подходит (для этого есть название... я сейчас не помню).
Лично я, когда начинал изучать SQL, нашел ссылку на W3 schools своей постоянной точкой остановки. Она соответствует моему стилю: я могу заглянуть в нее, чтобы найти быстрый ответ и двигаться дальше. Однако в конечном итоге, чтобы действительно воспользоваться преимуществами базы данных, необходимо углубиться в документацию производителя.
Хотя SQL "стандартизирован", к сожалению (хотя в некоторой степени и к счастью), каждый поставщик баз данных реализует свою собственную версию со своими расширениями, что может привести к тому, что совершенно разный синтаксис будет наиболее подходящим (обсуждение несовместимости различных баз данных по одному вопросу см. в документации SQLite по работе с NULL. В частности, стандартные функции, например, для обработки DATE и TIME, как правило, отличаются у разных производителей, есть и другие, более радикальные различия (в частности, не поддерживаются подвыборки или корректная обработка JOIN). Если вас интересуют некоторые детали, этот документ предоставляет как стандартные формы, так и отклонения для нескольких основных баз данных.
На техническую проблему уже есть хорошие ответы, поэтому я рассмотрю только некоторые из остальных ваших вопросов.
Если вы просто работаете с DataExplorer, вам нужно ознакомиться с синтаксисом SQL Server, поскольку именно с ним он работает. Лучшим местом для этого, конечно, является справочник MSDN.
Да, существуют различные вариации синтаксиса SQL. Например, предложение TOP
в запросе, который вы привели, специфично для SQL Server; в MySQL вы бы использовали вместо него предложение LIMIT
(и эти ключевые слова не обязательно должны появляться в одном и том же месте в запросе!).
Вы можете просто переписать предложение WHERE
where reputation > 10000
Это не всегда удобно. В качестве альтернативы можно использовать встроенное представление:
SELECT
a.DisplayName, a.Id, a.Reputation, a.RepInK
FROM
(
SELECT TOP 15
DisplayName, Id, Reputation, Reputation/1000 As RepInK
FROM
Users
ORDER BY Reputation DESC
) a
WHERE
a.RepInK > 10
Вы МОЖЕТЕ обратиться к RepInK в предложении Order By
, но в предложении Where
вы должны повторить выражение. Но, как уже говорили другие, оно будет выполнено только один раз.