SQLite数据库
SQLite
在Ubuntu安装sqlite数据库
在线安装:
sudo apt-get install sqlite3 libsqlite3-dev
打开数据文件:
sqlite3 filename.db (数据库文件名一般是以 .db 结尾)
系统命令
.help打开帮助文档.open打开数据库文件.quit退出数据库.q也可以.exit退出数据库
.tables查看当前数据库文件中有哪些数据表.schema查看建表语句(表的结构).headers on|off是否显示表头信息
SQL语句
1. 建表
CREATE TABLE 表名(字段名1 字段的类型1, ..., 字段n 字段类型n);
字段类型 :
整型INT或者INTEGER
字符串CHAR或者TEXTeg:CREATE TABLE student(id INT, name CHAR, score INTEGER);
2. 向表中插入数据
INSERT INTO 表名 VALUES(逗号分隔的字段的值);必须从左到右给每个字段赋值
INSERT INTO student VALUES(1001, "张三", 99);
INSERT INTO 表名(字段名) VALUES(字段的值);可以只给几个字段赋值
INSERT INTO student(id,name) VALUES(1002, "李四");
注意 : 如果是字符串要用 单引号 或者 双引号 引起来
3. 查询表中的记录
SELECT * FROM student;*表示查询表中所有字段SELECT id,name FROM student;只查询 id 和 nameSELECT * FROM student WHERE score=98;只查询 score 为 98 的记录SELECT * FROM student WHERE name="李四";字符串要加 引号
SELECT * FROM student WHERE score=99 AND id=1001;查询score是99并且 id是1001 的记录SELECT * FROM student WHERE score=99 OR name="李四";查询score是99 或者 name是李四 的记录
对查询到的结果进行排序 ,ORDER BY 根据哪个字段排序
默认是 升序ASC升序DESC 降序SELECT * FROM student ORDER BY score DESC;
4. 修改(更新)记录的内容
将student表中 id 为1001 的记录中的 名字改成 小小 成绩改成 0 分
UPDATE student SET name="小小",score=0 WHERE id=1001;
5.删除记录
DELETE FROM student WHERE id=1001;将id为1001的记录在 student 表中删除
6.删除表
DROP TABLE 表名;
7.添加一列
ALTER TABLE student ADD COLUMN sex text;在student表中添加一个字段 sex
8.删除一列
sqlite3 不允许直接删除一列
1)先创建一张新create table stu1 as select id,name from stu;少了score列
2)删除原来的旧表drop table stu;
3)对新表重命名alter table stu1 rename to stu;
9.表的主键
如果设置了某个字段为主键,那么该字段就不允许
重复CREATE TABLE student(id INT PRIMARY KEY, name TEXT, score INT);
SQLite数据库常用的API接口函数
sqlite3 函数的头文件
sqlite3.h
编译是要链接 sqlite3 的库-lsqlite3
1.打开一个数据库文件—sqlite3_open
int sqlite3_open(const char *filename, sqlite3 **ppDb );
功能:
打开一个数据库文件,存在直接打开 不存在 新建并打开
参数:
filename 数据库文件名字
ppdb 操作数据库的指针,句柄
返回值:
成功 SQLITE_OK
失败 error_code
eg:
sqlite3 *sql_db = NULL;int ret = sqlite3_open("NO1.db", &sql_db);
2.获取最后一次错误信息的函数—sqlite3_errmsg
const char *sqlite3_errmsg(sqlite3* db);
功能:获取错误信息描述
eg:
printf("错误信息[%s]\n", sqlite3_errmsg(sql_db));
3.执行sql语句的函数—sqlite3_exec
int sqlite3_exec(sqlite3* db, const char *sql, int (*callback)(void*,int,char**,char**),void * arg, char **errmsg);
功能:
执行一条sql语句
参数:
db 数据库的句柄指针
sql 将要被执行sql语句
callback 回调函数,只有在-查询语句-时,才给回调函数传参
arg 为callback 传参的
errmsg 错误信息的地址 如果使用了这个参数
需要用sqlite3_free() 函数释放空间!!!!!!!!!!
返回值:
成功 SQLITE_OK
出错 errcode 错误码
注意:
&errstr→printf("errmsg[%s]\n", errstr);错误信息打印方式
eg:
> IF NOT EXISTS 表不存在则创建 表存在则直接使用,而不是报错;引号里面sql语句后面不用加分号
> char *errstr = NULL;
> char buff[128] = "CREATE TABLE IF NOT EXISTS student(id INT PRIMARY KEY, name CHAR, score INT)";建表
> ret = sqlite3_exec(sql_db, buff, NULL, NULL, &errstr);
> if(ret != SQLITE_OK){
printf("errcode[%d] errmsg[%s]\n", ret, errstr);
exit(-1);
}
> sqlite3_free(errstr); 释放错误信息的空间 防止内存泄漏
sqlite3_exec的回调函数—callback
int (*callback)(void* arg ,int ncolumn ,char** f_value,char** f_name)
功能:
得到查询结果
参数:
arg 为回调函数传递参数使用的 --传递多个参数,使用结构体传参
ncolumn 记录中包含的字段的数目 --表的结构 字段数
f_value 包含每个字段值的指针数组 --字段值
f_name 包含每个字段名称的指针数组-字段名(表头)
返回值:
成功 0
出错 非0
eg:
> 1.回调函数
> int callback(void* arg ,int ncolumn , char** f_value, char** f_name)
> {
每查询到一条记录 这个函数就会被调用一次
return 0;//必须写返回值 否则报错
> }
>2.执行sql语句
> char sql_buff[256] = {0};
> sprintf(sql_buff,"SELECT * FROM student");查询
> sqlite3_exec(sql_db, sql_buff, callback, NULL, NULL);
4.查询结果的函数—sqlite3_get_table
int sqlite3_get_table(sqlite3 *db, const char *sql, char ***pazResult,int *pnRow, int *pnColumn, char **pzErrmsg);
功能:
查询数据库,它会创建一个新的内存区域来存放查询的结果信息
使用完之后要 释放 ,否则内存泄漏 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
参数:
db 数据库操作句柄
sql 数据库的sql语句
pazResult 查询的结果集
nRow 行数(不包括表头)
nColumn 列数
pzErrmsg 错误消息
返回值:
成功 0
出错 errcode
eg:
char **result = NULL; 结果集
int row = 0; 行数
int column = 0; 列数
1.sqlite3_get_table 内部会将 查询的到的结果的 行数写到row的地址里
会将 查询的到的结果的 列数写到column的地址里
2.会让 result 指向 sqlite3_get_table 申请的结果集的内存空间
int ret = sqlite3_get_table(sql_db, sql_buff, &result, &row, &column, NULL);
if(ret != SQLITE_OK)
{
printf("查询失败 errcode[%d] errmsg[%s]\n", ret, sqlite3_errmsg(sql_db));
return;
}
5.释放 sqlite3_get_table()函数产生的结果集—sqlite3_free_table
void sqlite3_free_table(char **result);
eg:
sqlite3_free_table(result);释放 结果集result防止内存泄漏
6.关闭数据库句柄—sqlite3_close
int sqlite3_close(sqlite3* db);
功能:关闭一个数据库
eg:
sqlite3_close(sql_db);关闭sqlite3 句柄
注意:
1. 错误信息打印方式
sqlite3_exec(sql_db, buff, NULL, NULL, &errstr)→printf("errmsg[%s]\n", errstr)sqlite3_free(errstr);释放错误信息errstr的空间 防止内存泄漏
sqlite3_exec(sql_db, buff, NULL, NULL, NULL)→printf("errmsg[%s]\n",sqlite3_errmsg(sql_db))
实例
基于SQLite数据库的学生管理系统 : 学生管理系统
更多推荐
所有评论(0)