В непроцедурных языках, что определяет, как все должно быть сделано? - PullRequest
3 голосов
/ 02 августа 2010

Если вы сравниваете C с SQL, это аргумент:

В отличие от процедурных языков такие как C, которые описывают, как вещи должно быть сделано, SQL не процедурный и описывает, что должно быть сделано.

Итак, часть как для языков, подобных SQL, определяется самим языком, не так ли? Что делать, если я хочу изменить способ работы какого-либо запроса. Предположим, я хочу изменить способ обработки SELECT. Это возможно?

Ответы [ 2 ]

4 голосов
/ 02 августа 2010

Итак, как часть для таких языков, как SQL определяется языком само по себе, это?

Не строго языком (т. Е. SQL), но обычно базой данных и ее оптимизатором. Таким образом, даже если одни и те же данные запрашиваются из таблиц с одинаковыми структурами и одинаковыми индексами, некоторые базы данных будут создавать набор результатов иначе, чем другие.

Предположим, я хочу изменить способ SELECT обрабатывается. Это возможно?

До некоторой степени, да. Вы можете либо:

  1. Перепишите запрос, чтобы достичь того же результата другим способом, или
  2. Использовать подсказку - http://en.wikipedia.org/wiki/Hint_%28SQL%29

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

Кроме того, я понимаю, что некоторые базы данных имеют дополнительные интерфейсы, которые позволяют более низкоуровневое взаимодействие с ядром базы данных, что обеспечивает больший контроль над тем, как строится запрос, чем это возможно из простого SQL. (Однако в вашем вопросе указан SQL.)

2 голосов
/ 02 августа 2010

Это на самом деле преувеличивает разницу.Нет четкой точки, в которой один рассказывает, как все делается, а другой - только то, что он делает.Скорее, может потребоваться указать, что / как делается с большей детализацией, чем другие.Типичная реализация SQL позволяет пользователю контролировать такие вещи, как то, какие индексы используются (или игнорируются), какие блокировки делать и т. Д.

Если вы выполняете ту же работу в C, вы(в какой-то момент) придется указывать гораздо больше деталей (если вы не использовали что-то вроде ODBC).Тем не менее, вы все еще рассказываете, что должно быть сделано, а не все детали того, как это должно быть сделано (например, несмотря на то, что, как минимум, на уровне ассемблера, как минимум, на языке ассемблера, C все равно автоматически выполнит некоторые преобразования типов, поэтомуне нужно рассказывать, как сделать что-то, например, добавить целое число к числу с плавающей запятой - вы просто скажете ему добавить их, и он обработает детали).

Итог: попытка поговорить оодин как процедурный, а другой как непроцедурный вводит в заблуждение.SQL не всегда требует столько подробностей, но это разница в степени, а не "как" и "что".

...