SQLite简介——2

简单的DML

  1. 查询语句
      • select * from 表名;
    • select 字段名 from 表名;
    • select 表名.字段名 from 表名;
    • select 表名.字段名 from 表名 as 别名;
    • select 字段名 from 表名 where 查询条件;
      • where 后面的语句的格式包括了SQL运算符,SQL通配符,逻辑运算
    • SQL通配符 ==like==
    • _ 表示一个字符 a like ‘张_’;
    • % 表示任意长度的字符串
    • [] 限制字符的取值范围 [0-9a-z]0到9,a到z取值范围——》sqlite3不支持
    • Sql运算符
    • <> 不等于
    • where 语句
    • between a and b
    • order by 子句
    • asc 升序(默认)
    • desc 降序
    • limit 子句
    • 限定数据输出的行范围
    • 优点: 节约内存 ,速度快
    • 格式: limit 4 查询结果显示4条
    • limit 3 offset 3 如果总共的数据有6个,那么第一页是1-3,第二页就从4-6.offset,指定偏移量,偏移量从0开始
    • offset这个偏移量就是翻页数从第几个开始。
    • distinct子句
    • 将重复的行合并,确保每一行都是唯一的。==只能对一列生效。==
  2. update 更新记录
    • UPDATE <表名> SET <列名 = 更新值> [WHERE <更新条件>]
    • 不能用于字符串的拼接
  3. 内连接
    • select student.*,score.Score from student,score where student.No=score.No;
    • 与上面的相等 select student.*,score.Score from student inner join score on student.No=score.No;
  4. 左外连接
    • 以左边的为基准,输出左边表的全部数据,右边的表根据匹配的输出。
  5. 右连接
    • 不支持右连接
  6. 自连接
### 关于 SQLite3 中 `stmt` 的用法 SQLite 使用预处理语句(prepared statements)来优化 SQL 查询执行效率。通过将查询编译成内部表示形式,可以减少重复解析和编译的时间开销。以下是关于 `stmt` 的基本概念及其常见用途。 #### 预处理语句的基础 在 SQLite 中,预处理语句由 C API 提供支持,主要涉及以下几个函数: - **`sqlite3_prepare_v2()`**: 将 SQL 字符串转换为可执行的预处理语句对象[^4]。 - **`sqlite3_step()`**: 执行预处理语句中的下一行数据操作[^5]。 - **`sqlite3_finalize()`**: 销毁预处理语句对象并释放资源[^6]。 这些函数通常用于绑定参数、多次执行相同结构的查询以及管理内存分配。 #### 示例代码展示如何使用 `stmt` 下面是一个简单的例子,演示如何利用 SQLite 的预处理语句插入多条记录: ```c #include <stdio.h> #include <sqlite3.h> int main() { sqlite3* db; char* err_msg = 0; int rc = sqlite3_open("test.db", &db); if (rc != SQLITE_OK) { fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } const char* sql_stmt = "INSERT INTO tbl1 VALUES (?, ?)"; sqlite3_stmt* stmt; rc = sqlite3_prepare_v2(db, sql_stmt, -1, &stmt, 0); if (rc != SQLITE_OK) { fprintf(stderr, "Failed to prepare statement: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } // 绑定第一个参数 sqlite3_bind_text(stmt, 1, "example text", -1, SQLITE_STATIC); // 绑定第二个参数 sqlite3_bind_int(stmt, 2, 42); // 执行插入操作 if (sqlite3_step(stmt) != SQLITE_DONE) { fprintf(stderr, "Insert failed: %s\n", sqlite3_errmsg(db)); } else { printf("Row inserted successfully.\n"); } // 清理预处理语句 sqlite3_finalize(stmt); sqlite3_close(db); return 0; } ``` 此程序展示了如何创建一条带有占位符 (`?`) 的 SQL 插入语句,并通过 `sqlite3_bind_*` 函数为其赋值。最后调用了 `sqlite3_step()` 来完成实际的数据写入过程[^7]。 #### 常见问题及解决方案 1. **错误消息捕获** 如果遇到异常情况,可以通过 `sqlite3_errmsg()` 获取详细的错误描述信息[^8]。 2. **性能优化建议** 对于批量插入场景,推荐先启动事务再提交更改,这样能显著提升速度。例如,在循环外包裹如下命令: ```sql BEGIN TRANSACTION; -- 多次执行 INSERT 操作... COMMIT; ``` 3. **防止 SQL 注入攻击** 利用预处理语句能够有效抵御恶意输入带来的安全风险,因为所有外部传入的内容都会被自动转义处理[^9]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值