sql - 请帮助我了解 SQL 与 C 之类的编程?

标签 sql c

具体来说,我试图了解 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/

相关文章:

mysql - 获取除 SQL 结果集之外的所有行

sql - PostgreSQL 用例 when result in where 子句

objective-c - 以线程安全的方式从环形缓冲区复制 Objective-C 中的数据

c++ - 如何在VSCODE中调试带有 "sudo"的程序

静态全局变量可以优化为在堆栈中吗?

MySQL 如何使用 WHERE 中的两个加密字段更新记录

sql - 计算一个日历周期内多个起止记录之间的天数

SQLite 抛出“SQL 中时间数据类型的 System.NotSupportedException

c++ - Vim 找不到 C++ libavformat/libavutil 库(没有那个文件或目录)

将 int 变量转换为 float