类型
关系型数据库:Oracle/DB2/Mysql(开源)/Sqlserver/sqlite(小型数据库)
非关系型数据库:Redis
sqlite3命令
创建(进入)数据库 sqlite3 <student>.db
.tables 查看所有表名
.schema ?TABLE? 显示 CREATE 语句。如果指定了 TABLE 表,则只显示匹配 LIKE 模式的 TABLE 表。
.headers on 显示表头信息
.mode column 以左对齐的列显示信息
.quit 退出
SQL语句
create table
创建表
使用形式:
create table 表名称(列1 数据类型, 列2 数据类型, ...);示例:
create table student(姓名 text, 性别 text, 年龄 integer, 成绩 double);
insert into
插入表
使用形式:
insert into 表名称 values(值1, 值2, ...);
示例:
insert into student values("张三", "男", 19, 89.5);
insert into student values("李四", NULL, NULL, 99.99);
insert into student (姓名, 年龄) values ("王二", 18);
select
查看表
使用形式:
select 列1,列2,... from 表名称 where 匹配条件 order by 列名称 asc/desc;
order by <列名称>asc按升序排列
order by <列名称>desc按降序排列
示例: select * from 表名称;
查看该表所有信息
select 姓名,成绩 from student;
查看student的姓名和成绩两列的所有信息
select 姓名,成绩 from student where 姓名 like "%张%";
查看student表中匹配姓名为某张某的姓名和成绩
select 姓名,成绩 from student order by 成绩 desc;
student表中的按成绩升序排列的姓名和成绩
select 姓名 from student where 成绩 > 85 order by 成绩 desc;
成绩>85且按降序排列的学生姓名
delete from
删除表
使用形式:
delete from student where 匹配条件;示例:
delete from student where 成绩>85
删除成绩大于85的学生信息
只能按行删,不能按列删
update
更新表
使用形式:
update 表名称 set 列1=值1,列2=值2 where 匹配条件;
示例:
update student set 性别="女", 成绩=86.3 where 姓名="王二";更新王二的性别和成绩
drop table
删除表
使用形式:
drop table 表名称;
多表联合查询
cross join:
交叉连接
如果在连接两个表时未指定连接条件,则数据库系统会将第一个表的每一行与第二个表的每一行合并。这种连接称为交叉连接或笛卡尔乘积
示例:
select student.id as 学号, student.name as 姓名, lesson.subject as 课程 from student cross join lesson;
inner join:
内连接
将表1和表2中所有同时满足条件的数据关联在一起
组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分
select student.id as 学号, student.name as 姓名, grade.score as 成绩 from student inner join grade on student.id =grade.stuid;
select student.id as 学号, student.name as 姓名, lesson.subject as 课程,grade.score as 成绩 from student inner join grade on student.id =grade.stuid inner join lesson on grade.lessonid = lesson.id;
select student.id as 学号, student.name as 姓名, lesson.subject as 课程,grade.score as 成绩 from student inner join grade on student.id =grade.stuid inner join lesson on grade.lessonid = lesson.id where 课程 ='语文';
outer join
外连接
左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
select grade.stuid as 学号,student.name as 姓名,lesson.subject as 课程,grade.score as 成绩 from grade left outer join student on grade.stuid = student.id inner join lesson on lesson.id = grade.lessonid;
select grade.stuid as 学号,student.name as 姓名,student.sex as 年龄,student.age as 性别,lesson.subject as 课程,grade.score as 成绩 from grade left outer join student on grade.stuid = student.id inner join lesson on lesson.id = grade.lessonid;
函数接口
sqlite3_open
sqlite3_open
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);功能:
打开一个数据库文件
参数:
filename:数据库文件名称
ppDb:数据库句柄
返回值:
成功返回SQLITE_OK
失败返回错误码
sqlite3_errmsg
sqlite3_errmsg
const char *sqlite3_errmsg(sqlite3*);
获得出错原因
sqlite3_exec
sqlite3_exec
int sqlite3_exec(
sqlite3*, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
功能:
执行SQL语句
参数:
sqlite3*:数据库句柄
sql:要执行的SQL语句字符串的首地址
callback:回调函数(只有在select语句时会使用,其余SQL语句只需传入NULL),对找到的数据要完成的操作,回调函数必须有正确返回值0
void *:给回调函数的参数
char **:存放错误信息空间首地址回调函数
int callback(void *arg,int column,char **pcontent,char** ptitle){}
arg:传入的参数
column:表列数
pcontent:查询到的数据
ptitle:表头
返回值:
成功返回SQLITE_OK
失败返回错误码
sqlite3_close
sqlite3_close
int sqlite3_close(sqlite3*);
功能:
关闭sqlite3数据库
示例:
创建student.db
创建student表(学号,姓名,性别,年龄,成绩)
插入三名学生
利用select打印三名学生信息
#include <stdio.h>
#include <sqlite3.h>
typedef struct student
{
char name[200];
char sex[100];
int age;
double score;
}stu_t;
int callback(void *arg,int column,char **pcontent,char** ptitle)
{
int i=0;
for(i=0;i<column;i++)
{
printf("\t%s\t",ptitle[i]);
}
printf("\n");
for(i=0;i<column;i++)
{
printf("\t%s\t",pcontent[i]);
}
printf("\n");
return 0;
}
int main()
{
int i=0;
sqlite3 *pDb=NULL;
char cmdbuff[1000]={0};
char *perrmsg=NULL;
int ret=0;
stu_t s[3]={
{"张三","男",18,89},
{"李四","女",20,95},
{"王五","男",19,88},
};
//打开数据库
ret=sqlite3_open("student.db",&pDb);
if(ret!=SQLITE_OK)
{
fprintf(stderr,"splite3_open failed: %s\n",sqlite3_errmsg(pDb));//stderr不用缓存
return -1;
}
//创建表
sprintf(cmdbuff,"create table if not exists student(id integer primary key asc,name text,sex text,age integer,score double);");
ret=sqlite3_exec(pDb,cmdbuff,NULL,NULL,&perrmsg);
if(ret!=SQLITE_OK)
{
fprintf(stderr,"sqlite_exec failed:%s\n",perrmsg);
sqlite3_free(perrmsg);//执行sqlite_exec出错后要为perrmsg申请空间,所有需要释放
sqlite3_close(pDb);
return -1;
}
//插入数据
for(i=0;i<3;i++)
{
sprintf(cmdbuff,"insert into student values(NULL,\"%s\",\"%s\",\"%d\",\"%lf\");",s[i].name,s[i].sex,s[i].age,s[i].score);
ret=sqlite3_exec(pDb,cmdbuff,NULL,NULL,&perrmsg);
if(ret!=SQLITE_OK)
{
fprintf(stderr,"sqlite_exec failed:%s\n",perrmsg);
sqlite3_free(perrmsg);
sqlite3_close(pDb);
return -1;
}
}
// 查询数据
sprintf(cmdbuff,"select * from student;");
ret=sqlite3_exec(pDb,cmdbuff,callback,NULL,&perrmsg);
if(ret!=SQLITE_OK)
{
fprintf(stderr,"sqlite_exec failed:%s\n",perrmsg);
sqlite3_free(perrmsg);
sqlite3_close(pDb);
return -1;
}
//关闭数据库
sqlite3_close(pDb);
return 0;
}
编译时要价-lsqlite3