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

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

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

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

Ответы [ 14 ]

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

Они подходят к миру с разных точек зрения. С о выполнении действий. 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 вы можете запросить список пользователей, например:

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 отстой в манипулировании наборами данных. При совместном использовании они могут легко получать данные, манипулировать ими и выполнять над ними какие-либо действия.

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

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

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

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

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

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

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

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

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

Итак, с C вы делаете все. Вот почему это называется «язык ассемблера высокого уровня». Или, цитируя моего друга, «C - это латынь компьютерных языков. Язык ассемблера - это хрюканье обезьян на деревьях».

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

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

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

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

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

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

Как? Разумеется, если ваша C-программа отправляет команды SQL в базу данных. ;)

Я надеюсь, что это как-то освещает, потому что в противном случае я буду просто выглядеть напыщенным, и так далее, для этого длинного бессвязного ответа. : -Р

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

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

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

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

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

Чтобы выполнить операцию FOR EACH, вам нужно использовать механизм зацикливания. В SQL Server (Transact-SQL) Наиболее распространенный такой цикл называется CURSOR и позволяет вам работать с одной строкой результатов за раз. Вот пример. Обратите внимание, что курсоры ужасно неэффективны по сравнению с операциями над множествами , поэтому используйте их осторожно.

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

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

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

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

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

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

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

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

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

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

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

Тогда возникает вопрос: «Как мне сформулировать мой вопрос в SQL, чтобы он выполнял именно то, что я хочу?», Что немного сложнее.

1 голос
/ 11 марта 2009

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

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

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

Оба подхода имеют свои плюсы и минусы.

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

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

1 голос
/ 11 марта 2009

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

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

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

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

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

Ваша новая вставка теперь выглядит как

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

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

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

Вы можете годами писать SQl, даже не используя курсор или цикл.

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

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

0 голосов
/ 23 августа 2016

Как упоминалось выше, SQL является декларативным языком, C - процедурным. Оператор SQL объявляет что нужно сделать , компилятор решает как . В «нормальном» языке, таком как C, функция или метод задают что и как манипуляции с данными должны выполняться. Есть некоторые типы задач, которые не могут быть решены с использованием только SQL. Существуют задачи, которые гораздо проще реализовать с использованием «обычных» языков программирования, например, рекурсии. Современные СУБД (Oracle, MS SQL, PostgreSQL и другие поддерживают рекурсивные запросы, но такие решения менее интуитивны и зачастую сложны для понимания по сравнению с реализациями на «нормальных» языках.

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