Пожалуйста, помогите мне понять SQL против C, как программирование? - PullRequest
12 голосов
/ 11 марта 2009

В частности, я пытаюсь понять, чем операторы SQL отличаются от обычного программирования в стиле C, я не могу понять, как делать что-то вроде «для каждого идентификатора пользователя в этой таблице, в котором есть другой столбец данных, равный такому-то, запустить эту хранимую процедуру ", которая в программировании была бы циклом for, как, черт возьми, вы делаете такие вещи?

Или, например, для каждой строки в таблице A, которая имеет идентификатор содержимого 11, добавьте новую строку в таблицу В, содержащую эти данные, и идентификатор пользователя из найденной строки таблицы А, содержащей идентификатор содержимого 11 ...

Кто-нибудь может написать немного о том, как я должен понимать операторы SQL по сравнению с программированием? Я чувствую, что мог бы справиться с этим лучше, если бы понял, как я должен был думать об этом ...

Ответы [ 14 ]

0 голосов
/ 11 марта 2009

На уровне определения C - это процедурный язык, а SQL - в значительной степени декларативный язык. Вы знаете о процедурных языках - программист говорит компьютеру, что делать. Или, другими словами, программист определяет процедуру, которую компьютер выполняет (надеюсь) для выполнения какой-то задачи.

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

Существует много декларативных компьютерных языков, из которых, вероятно, наиболее известен SQL. В общем, они основаны на математике, которая является обобщенным декларативным языком. Как уже отмечали другие, SQL основан на теории множеств. В частности, он основан на очень мощной реляционной модели , определенной Эдгаром Коддом. Хотя о теории, лежащей в основе SQL (и СУБД в целом), можно сказать много, она сводится к простой идее использования таблиц для определения отношений между данными.


Единственный поворот идеи о том, что SQL является декларативным языком, состоит в том, что каждое утверждение также имеет процедурный элемент. Для иллюстрации:

SELECT x FROM table WHERE y = 0;

SELECT x - это процедура выбора (или выбора) подмножества. FROM table определяет, над какими отношениями (или таблицами) работать. WHERE y = 0 - декларативная часть заявления. Он определяет подмножество данных, с которыми будут работать.

Между тем C имеет некоторые декларативные функции. Например:

A = x*y;

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

0 голосов
/ 11 марта 2009

SQL - это язык для запроса базы данных о наборах данных. Хотя вы можете использовать его для других операций, его следует использовать только для тяжелых операций, которые работают с большими кусками связанных данных. Несмотря на название S (стандартного) в названии, оно не является стандартным во всех своих функциях для отдельных СУБД. Реализация, используемая для MS SQL Server - Transact SQL или T-SQL.

C является универсальным языком. Вы можете писать в нем программы для чего угодно, но вы не должны делать с ним то, что можете с SQL (хотя вы можете).

На самом деле они бесплатны .

Вы можете найти много информации с помощью простого поиска в Google. Вы можете начать читать статью Википедии об этом или некоторый учебник .

0 голосов
/ 11 марта 2009

SQL не может делать то, что вы хотите, это язык для получения данных, основанных на определенных критериях, таких как записи по истечении определенного времени или содержащих определенную текстовую строку. Базы данных имеют расширения для языка SQL, которые позволяют вам работать с результатами после их возвращения, для Oracle это PL / SQL, а для сервера SQL это T-SQL.

0 голосов
/ 11 марта 2009

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

Оператор APPLY задокументирован здесь: http://technet.microsoft.com/en-us/library/ms175156.aspx. К сожалению, пример слишком сложный, но вот пример использования:

SELECT D.deptid, D.deptname, D.deptmgrid
    ,ST.empid, ST.empname, ST.mgrid
FROM Departments AS D
    CROSS APPLY fn_getsubtree(D.deptmgrid) AS ST;

При этом получается набор строк из столбцов Departments, затем вызывается функция для каждой строки, передавая столбец deptmgrid. Для каждого вызова функции, который возвращает результат, этот результат добавляется в окончательный набор результатов.

Обратите внимание, что все готово - без петель.

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