Раздел Beginner SQL: предотвращение повторного выражения

Я являюсь совершенно новым в 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 пункт?
    • Сделайте я, возможно, должен составить виртуальную таблицу с этим столбцом и затем сделать a SELECT/WHERE запрос на нем?
  • Я могу назвать выражение, например. Reputation/1000, таким образом, я только должен повторить имена в нескольких местах вместо формулы?
    • Что Вы называете этим? Макрос замены? Функция? Хранимая процедура?
  • Существует ли SQL quicksheet, глоссарий терминов, спецификация языка, что-нибудь, что я могу использовать для быстрого взятия синтаксиса и семантики языка?
    • Я понимаю, что существуют различные "разновидности"?

10
задан Cœur 6 July 2019 в 17:48
поделиться

5 ответов

Могу ли я использовать столбец RepInK " "в предложении WHERE?

Нет, но вы можете быть уверены, что ваша база данных будет оценивать (Репутация / 1000) один раз, даже если вы используете оба значения в полях SELECT и в разделе WHERE .

Может быть, мне нужно создать виртуальную таблицу / представление с этим столбцом, а затем выполнить для него запрос SELECT / WHERE?

Да, представление - это один из вариантов упрощения сложных запросов.

Могу я назвать выражение, напримерReputation / 1000, поэтому мне нужно только повторить имена в нескольких местах вместо формулы?

Вы можете создать определяемую пользователем функцию, которую вы можете вызвать примерно так convertToK , которая получит репутацию value в качестве аргумента и возвращает этот аргумент, разделенный на 1000. Однако это часто нецелесообразно для тривиального случая, такого как в вашем примере.

Есть ли краткая таблица SQL, глоссарий терминов, спецификация языка, что-нибудь, что я могу использовать, чтобы быстро понять синтаксис и семантику языка?

Я предлагаю попрактиковаться. Вы можете начать следовать тегу mysql в Stack Overflow, где каждый день задают множество вопросов новичкам. Загрузите MySQL , и когда вы думаете, что вопрос в пределах вашей досягаемости, попробуйте найти решение. Думаю, это поможет вам набрать скорость, а также познакомиться с особенностями языков. Сначала нет необходимости публиковать ответ, потому что здесь есть несколько довольно быстрых орудий по этой теме, но с некоторой практикой, я уверен, вы сможете донести до дома некоторые моменты :)

Я понимаю, что там есть разные «разновидности»?

На самом деле разновидности являются расширениями ANSI SQL . Поставщики баз данных обычно дополняют язык SQL такими расширениями, как Transact-SQL и PL / SQL .

9
ответ дан 3 December 2019 в 19:32
поделиться

Что касается чего-то вроде именованных выражений, то, хотя существует несколько возможных альтернатив, оптимизатору запроса лучше всего просто записать формулу Репутация / 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). Если вас интересуют некоторые детали, этот документ предоставляет как стандартные формы, так и отклонения для нескольких основных баз данных.

2
ответ дан 3 December 2019 в 19:32
поделиться

На техническую проблему уже есть хорошие ответы, поэтому я рассмотрю только некоторые из остальных ваших вопросов.

Если вы просто работаете с DataExplorer, вам нужно ознакомиться с синтаксисом SQL Server, поскольку именно с ним он работает. Лучшим местом для этого, конечно, является справочник MSDN.

Да, существуют различные вариации синтаксиса SQL. Например, предложение TOP в запросе, который вы привели, специфично для SQL Server; в MySQL вы бы использовали вместо него предложение LIMIT (и эти ключевые слова не обязательно должны появляться в одном и том же месте в запросе!).

1
ответ дан 3 December 2019 в 19:32
поделиться

Вы можете просто переписать предложение 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 
7
ответ дан 3 December 2019 в 19:32
поделиться

Вы МОЖЕТЕ обратиться к RepInK в предложении Order By, но в предложении Where вы должны повторить выражение. Но, как уже говорили другие, оно будет выполнено только один раз.

1
ответ дан 3 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

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