Неявные параметры по умолчанию SQL - PullRequest
0 голосов
/ 08 ноября 2018

Я не могу понять, какой смысл иметь неявные параметры по умолчанию в SQL (см. Пример ниже), учитывая, что SQL является декларативным языком. Разве форсирование параметров не является способом обеспечения большей читабельности? В конце концов, код должен быть написан один раз и прочитан людьми много раз (или хотя бы один раз).

Например, в PostgreSQL у нас есть следующий синтаксис :

T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 ON boolean_expression

Следующий запрос:

SELECT * 
FROM T1 JOIN T2
ON true;

подразумевает внутреннее соединение, означающее, что оно равно следующему запросу:

SELECT *
FROM T1 INNER JOIN T2
ON true;

Может кто-нибудь объяснить мне причину идеи по умолчанию и необязательных параметров (в нашем примере неявный тип объединения) в SQL?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Ваш вопрос немного сложен для понимания. INNER и OUTER не являются параметрами . Это ключевые слова. Синтаксическая диаграмма не делает этого явным, но SQL поддерживает следующие JOIN операторы:

  • JOIN
  • INNER JOIN
  • LEFT JOIN
  • LEFT OUTER JOIN
  • RIGHT JOIN
  • RIGHT OUTER JOIN
  • FULL JOIN
  • FULL OUTER JOIN
  • CROSS JOIN

Это попарно, кроме CROSS JOIN. Другими словами, INNER и OUTER являются необязательными.

Почему это так? На мой взгляд, в установлении стандартов SQL мало "мудрости". Комитет по стандартам состоит (в основном) из представителей отрасли, из компаний, которые часто уже внедрили функциональность . Стандарты объединяют это "совместимо". Итак, некоторые участники хотели явно указать INNER и OUTER. Другие не сделали. «Компромисс» - разрешить и то, и другое.

Что касается вашего вопроса, эти запросы эквивалентны. Но правильный способ выразить логику избегает предложения ON:

SELECT * 
FROM T1 CROSS JOIN T2;
0 голосов
/ 08 ноября 2018

Этот синтаксис был разработан стандартным комитетом SQL в его мудрости.

Никто не может обвинить SQL в чрезмерно кратком изложении, но я полагаю, что в некоторых случаях вариант сокращения синтаксиса считался подходящим (другой случай, который приходит на ум - CREATE TEMP[ORARY] TABLE).

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

Я думаю, что это был в основном вопрос вкуса и суждения со стороны людей, которые написали стандарт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...