что значит иметь предложение SQL FROM без запятой?



Я заметил сегодня, что этот запрос



 select * from table1 table2 where column_from_table1 = ?;


Работает. Он работает так же, как (возврат тех же столбцов)



 select * from table1 where column_from_table1 = ?;


Не должно ли первое быть синтаксической ошибкой? Как он интерпретирует table2?

524   2  

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

    Ничего не найдено.