# sqlite **Repository Path**: gxswift/sqlite ## Basic Information - **Project Name**: sqlite - **Description**: sqlite3 练习笔记 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-12-14 - **Last Updated**: 2024-12-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 下载链接 [SQLite3](https://www.sqlite.org/download.html) ## C/C++ 接口 API ``` sqlite3_open(const char *filename, sqlite3 **ppDb) ``` 该例程打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据库连接对象。如果 filename 参数是 NULL 或 ':memory:',那么 sqlite3_open() 将会在 RAM 中创建一个内存数据库,这只会在 session 的有效时间内持续。如果文件名 filename 不为 NULL,那么 sqlite3_open() 将使用这个参数值尝试打开数据库文件。如果该名称的文件不存在,sqlite3_open() 将创建一个新的命名为该名称的数据库文件并打开。 ``` sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg) ``` 该例程提供了一个执行 SQL 命令的快捷方式,SQL 命令由 sql 参数提供,可以由多个 SQL 命令组成。 在这里,第一个参数 sqlite3 是打开的数据库对象,sqlite_callback 是一个回调,data 作为其第一个参数,errmsg 将被返回用来获取程序生成的任何错误。 sqlite3_exec() 程序解析并执行由 sql 参数所给的每个命令,直到字符串结束或者遇到错误为止。 ``` sqlite3_close(sqlite3*) ``` 该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完成。 如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。 连接数据库 下面的 C 代码段显示了如何连接到一个现有的数据库。如果数据库不存在,那么它就会被创建,最后将返回一个数据库对象。 ```c #include #include int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; rc = sqlite3_open("test.db", &db); if( rc ){ fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); exit(0); }else{ fprintf(stderr, "Opened database successfully\n"); } sqlite3_close(db); } ``` 现在,让我们来编译和运行上面的程序,在当前目录中创建我们的数据库 test.db。您可以根据需要改变路径。 $gcc test.c -l sqlite3 $./a.out Opened database successfully 如果要使用 C++ 源代码,可以按照下列所示编译代码: $g++ test.c -l sqlite3 在这里,把我们的程序链接上 sqlite3 库,以便向 C 程序提供必要的函数。这将在您的目录下创建一个数据库文件 test.db,您将得到如下结果: -rwxr-xr-x. 1 root root 7383 May 8 02:06 a.out -rw-r--r--. 1 root root 323 May 8 02:05 test.c -rw-r--r--. 1 root root 0 May 8 02:06 test.db ### 创建表 下面的 C 代码段将用于在先前创建的数据库中创建一个表: ```c #include #include #include static int callback(void *NotUsed, int argc, char **argv, char **azColName){ int i; for(i=0; i #include #include static int callback(void *NotUsed, int argc, char **argv, char **azColName){ int i; for(i=0; i #include #include static int callback(void *data, int argc, char **argv, char **azColName){ int i; fprintf(stderr, "%s: ", (const char*)data); for(i=0; i #include #include static int callback(void *data, int argc, char **argv, char **azColName){ int i; fprintf(stderr, "%s: ", (const char*)data); for(i=0; i #include #include static int callback(void *data, int argc, char **argv, char **azColName){ int i; fprintf(stderr, "%s: ", (const char*)data); for(i=0; i SELECT tbl_name FROM sqlite_master WHERE type = 'table'; ``` 您可以列出关于 COMPANY 表的完整信息,如下所示: ``` sqlite> SELECT sql FROM sqlite_master WHERE type = 'table' AND tbl_name = 'COMPANY'; ``` ## Like 子句 SQLite 的 LIKE 运算符是用来匹配通配符指定模式的文本值。如果搜索表达式与模式表达式匹配,LIKE 运算符将返回真(true),也就是 1。这里有两个通配符与 LIKE 运算符一起使用: 百分号 (%) 下划线 (_) 百分号(%)代表零个、一个或多个数字或字符。下划线(_)代表一个单一的数字或字符。这些符号可以被组合使用。 ## Glob 子句 SQLite 的 GLOB 运算符是用来匹配通配符指定模式的文本值。如果搜索表达式与模式表达式匹配,GLOB 运算符将返回真(true),也就是 1。与 LIKE 运算符不同的是,GLOB 是大小写敏感的,对于下面的通配符,它遵循 UNIX 的语法。 星号 (*) 问号 (?) 星号(*)代表零个、一个或多个数字或字符。问号(?)代表一个单一的数字或字符。这些符号可以被组合使用。 ## Where 子句 SQLite的 WHERE 子句用于指定从一个表或多个表中获取数据的条件。 如果满足给定的条件,即为真(true)时,则从表中返回特定的值。您可以使用 WHERE 子句来过滤记录,只获取需要的记录。 WHERE 子句不仅可用在 SELECT 语句中,它也可用在 UPDATE、DELETE 语句中,等等 ## Update 语句 SQLite 的 UPDATE 查询用于修改表中已有的记录。可以使用带有 WHERE 子句的 UPDATE 查询来更新选定行,否则所有的行都会被更新。 ### Distinct 关键字 SQLite 的 DISTINCT 关键字与 SELECT 语句一起使用,来消除所有重复的记录,并只获取唯一一次记录。 有可能出现一种情况,在一个表中有多个重复的记录。当提取这样的记录时,DISTINCT 关键字就显得特别有意义,它只获取唯一一次记录,而不是获取重复记录。 ## 事务控制 使用下面的命令来控制事务: + BEGIN :开始事务处理。 + COMMIT:保存更改,或者可以使用 END TRANSACTION 命令。 + ROLLBACK:回滚所做的更改。 事务控制命令只与 DML 命令 INSERT、UPDATE 和 DELETE 一起使用。他们不能在创建表或删除表时使用,因为这些操作在数据库中是自动提交的。 ### BEGIN 命令 事务(Transaction)可以使用BEGIN 命令来启动。此类事务通常会持续执行下去,直到遇到下一个 COMMIT 或 ROLLBACK 命令。不过在数据库关闭或发生错误时,事务处理也会回滚。 ### COMMIT 命令 COMMIT 命令是用于把事务调用的更改保存到数据库中的事务命令。自上次 COMMIT 或 ROLLBACK 命令以外的所有事务保存到数据库。 ### ROLLBACK 命令 ROLLBACK 命令是用于撤消尚未保存到数据库的事务的事务命令。 ROLLBACK 命令只能用于撤销自上次发出 COMMIT 或 ROLLBACK 命令以外的事务。 ### 实例 开始一个事务,并从表中删除 age = 25 的记录,最后,我们使用 ROLLBACK 命令撤消所有的更改。 ``` sqlite> BEGIN; sqlite> DELETE FROM COMPANY WHERE AGE = 25; sqlite> ROLLBACK; ``` 检查 COMPANY 表,仍然有记录 开始另一个事务,从表中删除 age = 25 的记录,最后我们使用 COMMIT 命令提交所有的更改。 ``` sqlite> BEGIN; sqlite> DELETE FROM COMPANY WHERE AGE = 25; sqlite> COMMIT; ``` ## 基础操做 + 显示表 ``` .tables ``` + 显示概要 ``` .schema sqlite_master ``` + 格式化显示 ``` 显示头 sqlite>.header on 按列显示 sqlite>.mode column 显示运行时间 sqlite>.timer on 设置输出列的宽度 sqlite>.width 10, 20, 10 sqlite>SELECT * FROM COMPANY; ``` + 主键自动增加//历史最大值增加 ``` ID INTEGER PRIMARY KEY AUTOINCREMENT ``` + 删除表 ``` drop table company; ``` + 增加列 ``` alter table company add column DATE char(20); alter table company add column TIME char(10); ``` + 删除列 ``` alter table company drop column test; ``` + 添加时间日期 ``` insert into company values(6,'huang',31,'guangzhou',8999,date('now','localtime'),time('now','localtime')); ``` + 自动时间 ``` ... DATE TIMESTAMP NOT NULL DEFAULT(date('now','localtime')), TIME TIMESTAMP NOT NULL DEFAULT(time('now','localtime')) ``` + 筛选时间 ``` select * from company where time >time('12:00:00'); ``` + 修改内容 ``` update company set name='gcc' where id=18; ``` + 去重 ``` SELECT DISTINCT name FROM COMPANY; ``` + 筛选计数 ``` SELECT * FROM COMPANY GROUP BY name HAVING count(name) < 2; ``` + 排序 ``` SELECT * FROM COMPANY ORDER BY SALARY ASC; ``` + 字符加前缀 ``` update work set date='2024-'||date; ``` + 列求和 ``` select sum(time) from work; ```