SQLite数据库

目录

  • SQLite
    • 在Ubuntu安装sqlite数据库
    • 打开数据文件:
    • 系统命令
    • SQL语句
      • 1. 建表
      • 2. 向表中插入数据
      • 3. 查询表中的记录
      • 4. 修改(更新)记录的内容
      • 5.删除记录
      • 6.删除表
      • 7.添加一列
      • 8.删除一列
      • 9.表的主键
    • SQLite数据库常用的API接口函数
      • 1.打开一个数据库文件---sqlite3_open
      • 2.获取最后一次错误信息的函数---sqlite3_errmsg
      • 3.执行sql语句的函数---sqlite3_exec
        • 注意:
        • sqlite3_exec的回调函数---callback
      • 4.查询结果的函数---sqlite3_get_table
      • 5.释放 sqlite3_get_table()函数产生的结果集---sqlite3_free_table
      • 6.关闭数据库句柄---sqlite3_close
    • 注意:
    • 实例

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 或者 TEXT
eg:
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 和 name
SELECT * 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 错误码

注意:

&errstrprintf("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数据库的学生管理系统学生管理系统

你可能感兴趣的:(SQLite,sqlite,数据库,sql)