что значит иметь предложение SQL FROM без запятой?
Я заметил сегодня, что этот запрос
select * from table1 table2 where column_from_table1 = ?;
Работает. Он работает так же, как (возврат тех же столбцов)
select * from table1 where column_from_table1 = ?;
Не должно ли первое быть синтаксической ошибкой? Как он интерпретирует table2?
2 ответов:
select * from table1 table2 where column_from_table1 = ?;
table2работает как псевдоним таблицы дляtable1. Он вообще не используется в качестве имени объекта в базе данных. Тот факт, что таблица с именемtable2существует, совершенно не относится к этому запросу. Обычно вы видите что-то вроде этого:select t.id, t.name from table1 t where t.column_from_table1 = ?;Некоторые СУБД требуют ключевого слова
as, поэтому вы также увидите следующее:SELECT t.id, t.name FROM table1 AS t WHERE t.column_from_table1 = ?;Псевдонимы таблиц полезны для облегчения написания запросов с несколькими таблицами, особенно если у них есть общие имена столбцов, которые необходимо квалифицировать. Они также необходимы для самосоединений, когда таблица соединяется сама с собой.
Пример соединения с использованием псевдонимов:
SELECT t1.Id, t1.Name as t1_Name t2.Name as t2_Name FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id WHERE t1.column_from_table1 = ?;Или для самосоединения искать повторяющиеся значения
Name, например:Обратите внимание, что этот запрос ссылается наSELECT t1.Name, t1.Id t2.Id as Dupe_Id FROM table1 t1 JOIN table1 t2 ON t1.Name = t2.Name WHERE t1.Id < t2.Id;table1дважды и использует псевдонимыt1иt2, чтобы различать, на что он ссылается. Обратите внимание, что соединение через запятую, напримерFROM table1, table2 WHERE table1.id = table2.id, является очень старым синтаксисом, который следует явно избегать при написании запросы. Более старый синтаксис трудно читать и поддерживать, и он не поддерживает внешние соединения, за исключением специфичных для вендера расширений. Новый синтаксис с ключевым словомJOINбыл введен в стандартном SQL в 1992 году. Нет никаких причин все еще использовать соединения через запятую.
Похоже, что он интерпретирует его как переименование таблицы, хотя
table2существует, он счастливо позволяет переименовать, это также работает:select * from table1 asdf where asdf.column_from_table1 = ?;
Comments