Английская терминология MySQL-запросы
Мне нужна помощь с некоторой "терминологией" о деталях запроса. Но не только запрос PARTS, то любые "связанные с запросом цифры речи" также будут очень полезными, я сильно заинтересован в них. И не только о SELECT
(как в примере ниже), INSERT
s, UPDATE
и других запросах.
Например:
SELECT t1.f1, t1.f2, t2.f1 AS f1a, (t2.f2 * 10) AS f2a
FROM talbe1 AS t1
INNER JOIN table2 AS t2 ON (t1.f4 <> t2.f4)
WHERE t1.f3 > t2.f3
LIMIT 100, 9999
Я знаю, что:
1) t1, t2
- "псевдонимы таблицы", здесь нет ошибки?
2) f1a
- "псевдоним поля", f2a
- idk... "выражение alias" может быть? Есть ли разница между ними? Любое коллективное название?
3) 100
- "offset"
Я не уверен, как позвонить:
1) все между SELECT
и FROM
: t1.f1, t1.f2, t2.f1 AS f1a, (t2.f2 * 10) AS f2a
2) t1.f3 > t2.f3
"where clause"? "состояние"? что лучше? другие варианты?
3) (t1.f4 <> t2.f4)
"условие соединения"?
Также интересуется, если есть более одного соединения, можно ли их каким-то образом называть "заказ" или "глубина"? И если я могу сделать это с помощью "глубины", то как это будет с RIGHT JOIN
?
Любое другое интересное "обозначение вещей" с вашими примерами будет очень полезно. Как SELF-JOIN, могут быть некоторые другие соединения, которые имеют специальный вызов, что-то интересное, которое вы можете запомнить.
Ответы
Ответ 1
SQL очень формален, и он действительно хорошо структурирован.
Любой запрос (независимо от SELECT
или INSERT
и т.д.) Состоит из clauses. В SELECT
-queries я предлагаю начать читать его из FROM
-clause. В других случаях начинаются с DELETE
/INSERT
/UPDATE
предложений (первая строка). В этих разделах показано, что обрабатывается набор данных. В этих разделах вы можете увидеть таблицу или список или таблицы или JOIN
-выражения (в FROM
) или подзапросы в скобках. Список таблиц также означает объединение, но будет объяснено позже. Например.
... FROM tab1 t1
... FROM tab1 t1, tab2 t2
... FROM tab1 JOIN tab2 ON ( ... )
... FROM (select * from tab3 ...) t
DELETE tab4 ... /* doesn't delete the table, but its records*/
INSERT INTO tab5 ...
UPDATE tab6 t6 ...
UPDATE (select * from tab3 ... ) ...
Это ключевые положения, которые показывают, какие таблицы должны обрабатываться.
Внутри предложения каждая таблица или подзапрос может ссылаться с помощью псевдонима. Псевдонимы заменят имя таблицы во всех остальных частях запроса. В приведенных выше примерах t1, t2, t6 и t являются псевдонимами. Большинство СУБД не требуют слова AS
перед псевдонимом, и многие этого не допускают. Если присутствует псевдоним, вы должны использовать только этот псевдоним.
Все запросы (кроме INSERT
) могут содержать WHERE
-clauses. Этот раздел ограничивает количество затронутых строк. Он содержит условие. Можно дать одно простое условие одного сравнения (например, last_name="Ellison"
) или сложные условия, которые дополнительно используют логические операторы: AND
, OR
, NOT
. Различные части условия могут быть сгруппированы по скобкам.
WHERE t1.last_name="Ellison" AND t1.first_name="Clark"
WHERE usr.id=profile.usr_id AND
(usr.state="active" OR usr.role="contributor")
Другие предложения относятся к запросам. SELECT
-clauses содержит список выражений и дает проекция - создает новый набор столбцов для обработанного набора записей. Любое выражение может содержать псевдонимы столбцов, добавленные с помощью необязательного слова AS
.
ORDER BY
-clauses управляет порядком записей результатов (или набора результатов). Он применим только к запросу SELECT
-query. ORDER BY
должно быть последним предложением.
GROUP BY
-clauses и HAVING
-clauses используются для группировки определенных записей в один и фильтрации результата после группировки. Группировка заменяет несколько записей (которые имеют одинаковое значение в одном или нескольких полях) в одну запись. Эти предложения применимы к SELECT
-query.
A SELECT
запрос может быть (где квадратные скобки указывают дополнительные части):
SELECT expressions
FROM tables or join expressions
[WHERE simple or complex condition]
[GROUP BY expressions
[HAVING simple or complex condition]]
[ORDER BY expressions]
Другие проще:
DELETE table
[WHERE simple or complex condition]
UPDATE table
SET field=expression, field=expression, ...
[WHERE simple or complex condition]
INSERT INTO table[(fields...)]
VALUES (expressions...)
или в другой форме
INSERT INTO table[(fields...)]
SELECT... /* normal select-query */
Относительно JOIN
JOIN
представляет собой реализацию операции реляционной алгебры. При присоединении к какой-либо записи одной таблицы она объединяет это с записью другой таблицы и делает более широкую запись. INNER JOIN
(точное соединение) применяет это действие только к парам записей, которые соответствуют условию соединения.
... users INNER JOIN roles ON (roles.id=user.role_id) ...
LEFT OUTER JOIN
дополнительно добавляет непревзойденные записи из первой таблицы в результирующий набор. RIGHT JOIN
наоборот.
-- two identical joins using different join operators
... users LEFT OUTER JOIN roles ON (roles.id=user.role_id)...
... roles RIGHT OUTER JOIN users ON (roles.id=user.role_id)...
FULL OUTER JOIN
делает оба, он дает результат INNER JOIN
плюс несравнимые записи из левой таблицы плюс несравнимые записи из правой таблицы.
Слова INNER
и OUTER
являются необязательными. Вы можете их опустить, и ничего не меняется.
Ответ 2
Вам может быть интересно, что официальный синтаксис MySQL должен сказать об этом. По-моему, вы никогда не можете быть слишком формальным при попытке описать что-то математическое, как терминология языка программирования.
1.
t1.f1
называется select_expr, fudge-произносится на английском языке как "select expression". Обратите внимание:
Каждый select_expr
указывает столбец, который вы хотите получить.
Таким образом, другой менее формальный способ назвать его на английском языке, вероятно, будет "столбец".
2.
Синтаксис, по-видимому, отличает предложение и условие, в котором предложение включает в себя только ключевое слово WHERE
, но это условие является просто явным SQL-выражением внутри.
Предложение WHERE
, если задано, указывает условие или условия, которые должны соответствовать строки, которые должны быть выбраны. where_condition
- выражение, которое оценивается как true для каждой выбранной строки.
а также
В выражении WHERE
вы можете использовать любую из функций и операторов, поддерживаемых MySQL, за исключением агрегатных (сводных) функций. См. Раздел 9.5 "Синтаксис выражения"
3.
От другой страницы документации синтаксиса
MySQL поддерживает следующие синтаксисы JOIN
для table_references
части операторов SELECT
Таким образом, вся часть, о которой таблицы относятся к SELECT
from, называется "ссылкой на таблицу". Отсюда мы можем выкопать в синтаксис бит для производства, который соответствует вашему приведенному выше примеру:
join_table: table_reference [INNER | CROSS] JOIN table_factor [join_condition]
Это означает, что часть, о которой вы говорите, содержится в "условии соединения". Однако, как и в случае с предложением WHERE
выше, условие соединения также содержит ключевое слово ON
. Фактическое выражение (t1.f4 <> t2.f4)
- это опять-таки старое conditional_expr
или "условное выражение", как и одно из предложения WHERE
выше.
Более подробная информация с этой страницы документа дает ценную информацию:
conditional_expr
, используемый с ON, представляет собой любое условное выражение формы, которое может использоваться в предложении WHERE. Как правило, вы должны использовать предложение ON для условий, которые определяют, как присоединиться к таблицам, и предложение WHERE, чтобы ограничить, какие строки вы хотите в наборе результатов.
Таким образом, вы можете неофициально различать их полезными и значимыми способами, вызывая условие WHERE
"выражение ограничения строки" и условие JOIN
"выражение условия соединения".
Ответ 3
Q: 1) все между SELECT
и FROM
: t1.f1, t1.f2, t2.f1 AS f1a, (t2.f2 * 10) AS f2a
A: Я называю это " выбрать список". Это список выражений, которые возвращаются. Каждое выражение в списке является столбцом в наборе результатов. (Выражение может быть таким же простым, как имя столбца, или может быть больше задействовано, возврат из функции или операции сравнения.
Q: 2) t1.f3 > t2.f3 "where clause"? "состояние"? что лучше? другие варианты?
A: Общий термин для этих условий, который должен быть удовлетворен для возвращения строки, является "предикатом ". Предикаты - это условия в предложениях WHERE
или ON
, которые должны быть выполнены для возврата строки.
Q: 3) (t1.f4 < > t2.f4) "условие соединения"?
A: Опять же, это предикат . Это просто появляется в предложении ON, а не в предложении WHERE
. Также подходит термин "условие соединения". Но с точки зрения того, как эта база данных анализирует и выполняет оператор, это просто еще один предикат.
Нормативная практика заключается в том, что условие объединения должно быть включено в предложение ON
и другие условия в предложении WHERE.
Ответ 4
1) 2) Я бы использовал псевдонимы, которые показывают, на что они ссылаются. Например, select ... from my_first_table mft inner join user_rights ur where ...
.
Но если у вас нет лучших вариантов, "t1, t2,..." в порядке.
3) yes
1) выбрать предложение или поля
2) где предложение
3) "условие соединения" является правильным
Ответ 5
Кажется, вы поняли большинство терминов неплохо, я бы сказал, и я верю, что вы будете поняты в большинстве своих формулировок. Глядя на официальную документацию, также кажется хорошей идеей.
Вот мои ответы на ваши вопросы, сначала давайте ответить тем, кого вы знаете:
- "Табличные псевдонимы" хороши.
- "псевдоним поля" или "псевдоним выражения" являются хорошими. Общим ответом может быть "псевдоним столбца", поскольку эти операторы определяют столбцы вашего результата.
- "смещение" (или, возможно, "смещение строки" ) хорошо
Те, о которых вы не очень уверены:
- Между
SELECT
и FROM
я бы использовал либо выражение "select expression", либо выражение столбца или определения столбцов
- Я обычно использую "где выражения"
- "условие соединения" или "выражение объединения" одинаково мне понятны
При обращении к различным объединениям я бы либо разделил их на единственное "внутреннее соединение", либо "левое соединение", или если у вас есть несколько объединений, используйте что-то вроде "join on table1". "Self join", конечно, ссылается на соединение, ссылающееся на себя, используя другой псевдоним, но может запутаться, если у вас также есть много других объединений.
В целом большинство людей понимали бы и игнорировали бы незначительные ошибки в формулировке, если бы понимали ваши намерения и решение.