具体来说,我试图了解 SQL 语句与普通 C 风格编程有何不同,我似乎无法理解如何做诸如“对于此表中具有另一列数据等于某某的每个用户 ID,运行这个存储过程”,在编程中这将是一个 for 循环,你到底是怎么做到的?
或者,对于 tableA 中 contentID 为 11 的每一行,将新行添加到 tableB 中,其中包含此数据以及 tableA 中找到的包含 contentID 为 11 的行中的 userID...
有没有人介意写一些关于与编程相比我应该如何理解 SQL 语句的文章?我觉得如果我理解我应该如何思考它,我可以更好地运用它......
最佳答案
他们从不同的角度接近这个世界。 C是关于执行 Action 。 SQL是关于存储数据和操作数据的。它唯一擅长的“ Action ”是提取和更改数据。
将您的所有数据想象成一个 Venn diagram - 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';
请注意,此 UPDATE 可能会影响任意数量的行,但没有循环...您只是在说“查找这些记录,并以这种方式更改它们”。
但是,如果您想向他们发送提醒,那就太糟糕了……您必须使用 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 也不擅长操作数据集。结合使用,它们可以轻松获取数据、操作数据并对其执行操作。
关于sql - 请帮助我了解 SQL 与 C 之类的编程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/634775/