Помогите мне понять SQL по сравнению с C как программирование?

Этот тип задачи лучше всего выполнять с (хвостовой) рекурсией (также никогда не используйте var, если вы не полностью уверены, что вам это нужно ... а также, null также чего следует избегать, используйте вместо этого Option):

case class Node[A](value: A, next: Option[Node[A]]) {
   @tailrec
   final def calleachnode(f: A => Unit): Unit = {
     f(value)
     next match {
       case Some(next) => next.calleachnode(f)
       case None => ()

     }
   }
 }
12
задан JosephStyons 12 March 2009 в 18:41
поделиться

13 ответов

Они приближаются к миру с различных точек зрения. C о работающих действиях. SQL о том, чтобы хранить данные и управлении данными. Единственные "действия", к которым это способно, вытягивают и изменяют данные.

Думайте обо всех своих данных как схема Венна - SQL позволяет Вам "посмотреть" на любую часть той схемы, которую Вы хотите.

Если Вы хотите на самом деле сделать что-то к тем данным, то в C, Вы могли бы сказать, "Переходят к каждому пользователю и выполняют это действие с ними", как в

//if a customer is late, send them a reminder
for(int i=0;i<USER_COUNT-1;++i){
  if(LATE_ON_PAYMENTS=CustomerType(Customers[i])){
    SendReminder(Customers[i]);
  }  //if cust is late on their payments
}  //for ea customer

В SQL Вы смогли бы к ASK для списка пользователей, как в:

SELECT *
FROM CUSTOMERS
WHERE LATE_FLAG = 'Y';

Или Вы могли изменить данные относительно тех клиентов, как в:

UPDATE CUSTOMERS
SET TRUST_LEVEL = TRUST_LEVEL - 1  --trust a little less when they are late
WHERE LATE_FLAG = 'Y';

Обратите внимание, что это ОБНОВЛЕНИЕ могло влиять на любое количество строк, но нет никакого цикла... Вы просто говорите, "ищут эти записи и изменяют их таким образом".

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

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

//if a customer is late, send them a reminder

//get all the late customers
sqlCommand = 'SELECT CUSTOMER_ID FROM CUSTOMERS WHERE LATE_FLAG = ''Y''';
dataSet = GetDataSet(sqlCommand);

//now loop through the late customers i just retrieved    
for(int i=0;i<dataSet.RecordCount - 1;++i){
  SendReminder(dataSet[i].Field('CUSTOMER_ID'));
}  //for ea customer

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

Так же, как SQL сосет при выполнении обязательных действий, C сосет при управлении наборами данных. Используемый вместе, они могут легко получить данные, управлять ими и выполнить действия с ними.

21
ответ дан 2 December 2019 в 03:16
поделиться

SQL является языком запросов, разработанным для работы над наборами данных. Я заметил, что некоторые программисты, делающие ошибку получения большого набора результатов от SQL и затем цикличного выполнения по набору в C, фильтруют данные. Оптимальный дизайн сделал бы, как очень установлено просачивающийся SQL, позволяющий DB обрезать Ваш набор вниз к самому маленькому набору данных, необходимо сделать циклы или другую бизнес-логику. Таким образом, в основном ответ на Ваш вопрос является использованием SQL для получения Вас, самый маленький набор данных затем использует C для управления набором данных согласно бизнес-логике.

6
ответ дан 2 December 2019 в 03:16
поделиться

Позвольте мне взять трещину в этом. Я беру дальнюю дорогу здесь, поэтому терпите меня.

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

Ответ является контекстом. Это - что-то, что люди ужасно хороши в том, таким образом, не удивительно, что это - основа большой части того, что делает компьютер. Механизмы сложны, но эффект конца составляет компьютер, который постоянно переключает перспективу, чтобы сделать невероятно гибкие вещи с невероятно набором ограниченных данных.

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

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

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

Так, при приближении к языку действительно ли он быть языком запросов или объектно-ориентированным языком или процедурным языком, первый вопрос должен быть, "Какова перспектива этого языка? Каков его взгляд на задачу решения задач?" Я пошел бы, насколько предположить, что язык без ясного видения себя является большей проблемой, чем это стоит.

С C я предположил бы, что перспектива - это: "Даже самые низкие операции уровня весьма различных процессоров могут быть описаны в простом, общеязыковом". C разработан для получения у руля любого процессора там, все еще имея тот же старый руль, педали и тире.

Таким образом с C, Вы делаете все. Вот почему это упоминается как "высокоуровневый ассемблер". Или, чтобы заключить моему другу в кавычки, "C является латынью языков программирования. Ассемблер является пехотинцами обезьян в деревьях".

SQL является совершенно другим зверем с совершенно другой точкой зрения... или является этим? Перспектива SQL - это: "Даже самые сложные команды весьма различных баз данных могут быть описаны в простом, общеязыковом".

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

Так, таким образом, C является языком, используемым для предоставления обычно понятых команд любому произвольному ЦП, в то время как SQL является языком, используемым для предоставления обычно понятых команд любому произвольному бэкенду базы данных.

Теперь, где делают их секущие цепи? Это на самом деле довольно просто.

Что делает ЦП? Это получает, преобразовывает и отправляет информацию. Таким образом, если Ваша цель состоит в том, чтобы интерпретировать и представить данные или принять команды от конечного пользователя, Вы работаете в C. C для процедур, которые необходимо автоматизировать с помощью компьютера.

Что делает база данных? Это хранит, группы и получает большие наборы информации. Таким образом, если в какой-либо точке Ваша программа C должна сохранить, сгруппировать или получить большой набор данных или подмножества большого набора данных, то возможности, Вы будете взаимодействовать с базой данных.

Как? При наличии Вашей программы C отправляют команды SQL в базу данных, конечно.;)

Я надеюсь, что это освещает вещи несколько, потому что иначе я буду просто похож на напыщенный so-whatever для этого долгого, хаотичного ответа.:-P

8
ответ дан 2 December 2019 в 03:16
поделиться

Основное различие между SQL и языками как C - это:

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

"Дайте мне все счета с суммой> 10" =>, SQL выясняет, как создать набор результатов и отдает его Вам,

В C Вы указываете то, что Ваша программа должна сделать для получения набора результатов. Пример:"

  1. Элемент списка
  2. Создайте список результатов,
  3. Получите все счета,
  4. Возьмите самый важный счет,
  5. Если сумма> 10, поместила его в список результатов, иначе удаляет его,
  6. Если существует больше счетов, goto шаг 4,
  7. Возвратите набор результатов."

Вопрос затем: "Как я формулирую свой вопрос в SQL так, чтобы он сделал точно, что я хочу?", который является немного более трудным.

2
ответ дан 2 December 2019 в 03:16
поделиться

SQL не сделает всего это для Вас. Необходимо будет использовать что-то как T-SQL или МН / SQL или независимо от того, что разновидность базы данных имеет.

Я нашел, что это было отличным способом начать в МН Oracle / SQL. Используйте триггер для исчерпывания proc каждый раз, когда ВСТАВКА или ОБНОВЛЕНИЕ происходят.

3
ответ дан 2 December 2019 в 03:16
поделиться

Операции SQL находятся на SETS данных. Таким образом, можно сделать вещи как это для работы на все записи соответствия.

UPDATE table1 SET x = x+1 WHERE y = 1

Для выполнения ДЛЯ КАЖДОЙ операции, необходимо использовать механизм цикличного выполнения. В SQL Server (Transact-SQL) наиболее распространенное такой цикл называют КУРСОРОМ и позволяет Вам воздействовать на одну строку результата за один раз. Вот пример. Обратите внимание, что курсоры ужасно неэффективны по сравнению с операциями присвоения, так используйте их с осторожностью.

3
ответ дан 2 December 2019 в 03:16
поделиться

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

2
ответ дан 2 December 2019 в 03:16
поделиться

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

Вы хотите работать с наборами данных и влиять на все в одном действии.

"для каждого идентификатора пользователя в этой таблице, которая имеет другой столбец данных, равных такой и такой, выполняет эту хранимую процедуру", Это было бы плохой вещью сделать в SQL. В целом то, что Вы хотите, должно записать новую процедуру, которая основана на наборе. Например, предположите, что Ваш SP делает простую вставку, где @test и @test2 являются входными переменными.

insert table1 (field1, field2)
values (@test, @test2)

Для применения к группе значений, лучше поместить группу значений во временной таблице или табличной переменной (Или они могут и часто быть на самом деле быть значениями, которые можно вытянуть из существующей таблицы данных),

Ваша новая вставка теперь становится чем-то как

insert table1 (field1, field2)
Select field1, field2 from @temp

Причина, почему Вы хотите сделать, это - то, что основанные на наборе операции являются путем быстрее, чем строка операциями строки.

Первыми вещами, в которых необходимо чувствовать себя довольными в обучении использовать SQL, являются Соединения, основанные на наборе операции, оператор вставки, обновление statment, обвинение stament и избранный оператор. Удостоверьтесь, что Вы понимаете, как эффективно использовать, участвует во всех операторах действия, а также выбирает. Вот ссылка, чтобы начать помогать, Вы понять присоединяетесь к http://www.tek-tips.com/faqs.cfm?fid=4785

Можно пойти в течение многих лет, пишущий SQL, никогда не используя курсор или цикл.

К undestand различие между языком как C и SQL - то, что в основном SQL является специализированным типом языка, который касается операций базы данных. C менее касается доступа к данным, чем с тем, как целое приложение будет работать. Поэтому, так как у них есть различные цели, они приближаются к вещам очень по-другому. Очень мало того, что Вы знаете от C, относится к SQL. Они - действительно яблоки и апельсины.

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

1
ответ дан 2 December 2019 в 03:16
поделиться

Оба - языки программирования (оба полные по Тьюрингу в зависимости от Вашего точного диалекта SQL), однако...

C (C++, C#, Java, Visual Basic) языки Процедурного программирования. Вы указываете последовательность шагов для компьютера для взятия. Компьютер не понимает цели, он просто делает то, что Вы говорите ему. Думайте об этом как о восходящем подходе к программированию.

SQL (Haskell, LISP, когда похоже на него) является языками Функционального программирования. Вы указываете цель, и компьютер выясняет лучшую последовательность событий для достижения ее. Думайте это как вершина вниз приближается к программированию.

Оба подхода имеют свои за и против.

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

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

1
ответ дан 2 December 2019 в 03:16
поделиться

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

0
ответ дан 2 December 2019 в 03:16
поделиться

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

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

На самом деле они являются дополнительными.

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

0
ответ дан 2 December 2019 в 03:16
поделиться

Прием - то, что 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;

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

Обратите внимание, что это - все наборы - никакие циклы.

0
ответ дан 2 December 2019 в 03:16
поделиться

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

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

Существует много декларативных языков программирования, из которых SQL является, вероятно, самым известным. В целом они основаны на математике, которая является обобщенным декларативным языком. Как другие указали, SQL основан на теории множеств. Строго говоря, это основано на очень мощной реляционной модели, определенной Edgar Codd. В то время как существует много, чтобы быть сказанным о теории позади SQL (и RDBMS в целом), это сводится к простой идее использовать таблицы для определения отношений между данными.


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

SELECT x FROM table WHERE y = 0;

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

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

A = x*y;

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

0
ответ дан 2 December 2019 в 03:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: