数据库编程

类型 

关系型数据库: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

  • 33
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值