首页 > 数据库 >数据库编程

数据库编程

时间:2024-08-27 23:22:33浏览次数:12  
标签:join grade 数据库 编程 student sqlite3 lesson select

类型 

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

标签:join,grade,数据库,编程,student,sqlite3,lesson,select
From: https://blog.csdn.net/m0_64378221/article/details/141437352

相关文章

  • 【Rust光年纪】解锁Rust开发新姿势:数据库客户端和搜索引擎库探秘
    用Rust打造高效应用:数据库客户端与搜索引擎库全攻略前言随着Rust语言的不断发展,越来越多的优秀库和工具涌现出来,为开发者提供了更多选择和便利。本文将介绍几个用于Rust语言的数据库客户端和搜索引擎库,它们在不同领域都展现出了强大的功能和灵活的应用场景。欢迎订阅专......
  • Task 异步编程
    任务和线程的区别在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net4.0之后被一种称为基于“任务的编程模型”所冲击,因为task会比thread具有更小的性能开销,不过大家肯定会有疑惑,任务和线程到底有什么区别?1:任务是架构在线程之上......
  • MySQL数据库(2)——DML、视图、函数
    目录1、DML——数据操作语言(DataManipulationLanguage)2、添加数据2.1语句添加2.2文件加载3、修改数据4、删除数据5、查询数据5.1DQL基本关键字及其说明 着重号SQL简单查询5.2别名查询5.3去重查询5.4单表查询算数运算符比较运算符逻辑运算符范围......
  • 【效率提升工具推荐】AI编程工具合集
    AI编程工具是指那些专门为开发和训练人工智能模型而设计的工具和框架。这些工具可以帮助开发者更高效地构建、训练和部署机器学习和深度学习模型。以下是一些常用的AI编程工具及其特点:1.TensorFlow简介:由Google开发,是最流行的开源机器学习框架之一。特点:支持广泛的机器学......
  • C语言:编程世界的基石
    在计算机科学的世界里,C语言就像一座坚固的桥梁,连接着硬件和软件的两端。自从20世纪70年代诞生以来,C语言以其简洁、高效和强大的特性,成为了编程领域的经典之作。本文将探讨C语言在不同工作领域中的应用,以及它为何能够历经时间的考验,依旧活跃在现代编程的舞台上。目录1.系......
  • 第三章 异步编程
    3.1事件循环理解成为一个死循环,去检测并执行某些代码。#伪代码任务列表=[任务1,任务2,任务3,...]whileTrue:可执行的任务列表,已完成的任务列表=去任务列表中检查所有的任务,将'可执行'和'已完成'的任务返回for就绪任务in可执行的任务列表:......
  • JdbcTemplate教程:JdbcTemplate连接MySQL数据库从入门到进阶
    一、入门了解JDBC概念:JDBC(JavaDataBaseConnectivity):Java数据库连接技术:具体讲就是通过Java连接数据库,并且可以通过发送SQL指令,实现对表中数据执行增、删、改、查等操作的技术。原生JDBC编程(了解一下):        查询t_user表(包括字段:user_id,username,password)中的......
  • 7-9 期末编程作业计分规则
    期末编程作业计分规则。PTA上的题目集的排名页以总分(满分不一定是100分)的形式按排名顺序显示每个同学的成绩,但相同分数的同学无论排名是靠前还是最后得分都是一样的。为了表示排名区分度,根据排名给出了一个简单的计分规则,以示有所区分。计分规则如下:成绩折合成100分(取整),然后......
  • GUI编程02:Panel面板讲解
    本节内容视频链接:4、Panel面板讲解_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p=4&vd_source=b5775c3a4ea16a5306db9c7c1c1486b5在窗口(frame)中添加面板(panel), 并解决了窗口关闭事件。packagecom.yundait.www;importjava.awt.*;importjava.awt.e......
  • 自动化部署Mysql数据库的脚本
    #!/bin/bash#authorhlc#createTime2024-06-17#modifyTime2024-06-18#version1.0#description自动安装Mysqlsource/etc/init.d/functions#定义参数#用于循环count=0#时间date=$(date"+%H:%M:%S:%N")#==========Mysql服务器参数==========#Mysql服......