当前位置: 首页 > news >正文

如何使用SQL进行多表联合查询(SQLⅰte举例)

使用C++和SQLite进行多表联合查询的示例代码。假设有两个表: students  表和  scores  表, students  表包含学生的基本信息, scores  表包含学生的成绩信息,通过学生的  id  进行关联查询。

#include <iostream>

#include <sqlite3.h>

#include <string>

 

// 回调函数,用于处理查询结果

static int callback(void *NotUsed, int argc, char **argv, char **azColName) {

    for (int i = 0; i < argc; i++) {

        std::cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << " ";

    }

    std::cout << std::endl;

    return 0;

}

 

int main() {

    sqlite3 *db;

    char *zErrMsg = 0;

    int rc;

 

    // 打开数据库

    rc = sqlite3_open("test.db", &db);

    if (rc) {

        std::cerr << "Can't open database: " << sqlite3_errmsg(db) << std::endl;

        return 0;

    } else {

        std::cout << "Opened database successfully" << std::endl;

    }

 

    // 创建students表

    std::string sqlCreateStudents = "CREATE TABLE IF NOT EXISTS students ("

                                    "id INTEGER PRIMARY KEY AUTOINCREMENT,"

                                    "name TEXT NOT NULL,"

                                    "age INTEGER NOT NULL);";

    rc = sqlite3_exec(db, sqlCreateStudents.c_str(), 0, 0, &zErrMsg);

    if (rc != SQLITE_OK) {

        std::cerr << "SQL error: " << zErrMsg << std::endl;

        sqlite3_free(zErrMsg);

    }

 

    // 创建scores表

    std::string sqlCreateScores = "CREATE TABLE IF NOT EXISTS scores ("

                                   "id INTEGER PRIMARY KEY AUTOINCREMENT,"

                                   "student_id INTEGER NOT NULL,"

                                   "math_score REAL NOT NULL,"

                                   "english_score REAL NOT NULL,"

                                   "FOREIGN KEY (student_id) REFERENCES students(id));";

    rc = sqlite3_exec(db, sqlCreateScores.c_str(), 0, 0, &zErrMsg);

    if (rc != SQLITE_OK) {

        std::cerr << "SQL error: " << zErrMsg << std::endl;

        sqlite3_free(zErrMsg);

    }

 

    // 插入学生数据

    std::string sqlInsertStudents = "INSERT INTO students (name, age) VALUES ('Alice', 20); "

                                    "INSERT INTO students (name, age) VALUES ('Bob', 21);";

    rc = sqlite3_exec(db, sqlInsertStudents.c_str(), 0, 0, &zErrMsg);

    if (rc != SQLITE_OK) {

        std::cerr << "SQL error: " << zErrMsg << std::endl;

        sqlite3_free(zErrMsg);

    }

 

    // 插入成绩数据

    std::string sqlInsertScores = "INSERT INTO scores (student_id, math_score, english_score) VALUES (1, 90.5, 85.0); "

                                  "INSERT INTO scores (student_id, math_score, english_score) VALUES (2, 80.0, 75.5);";

    rc = sqlite3_exec(db, sqlInsertScores.c_str(), 0, 0, &zErrMsg);

    if (rc != SQLITE_OK) {

        std::cerr << "SQL error: " << zErrMsg << std::endl;

        sqlite3_free(zErrMsg);

    }

 

    // 多表联合查询

    std::string sqlQuery = "SELECT students.name, students.age, scores.math_score, scores.english_score "

                           "FROM students "

                           "JOIN scores ON students.id = scores.student_id;";

    rc = sqlite3_exec(db, sqlQuery.c_str(), callback, 0, &zErrMsg);

    if (rc != SQLITE_OK) {

        std::cerr << "SQL error: " << zErrMsg << std::endl;

        sqlite3_free(zErrMsg);

    }

 

    // 关闭数据库

    sqlite3_close(db);

    return 0;

}

上述代码先创建了  students  表和  scores  表,并插入了一些测试数据,然后通过  JOIN  关键字将两个表基于  students.id  和  scores.student_id  的关联关系进行联合查询,将学生的基本信息和成绩信息一起查询并输出。

相关文章:

  • 爬虫:scrapy面试题大全(60个scrapy经典面试题和详解)
  • Linux作业2——有关文件系统权限的练习
  • CTF【WEB】学习笔记1号刊
  • 【Jwt】详解认证登录的数字签名
  • 缓存设计模式
  • C语言-发布订阅模式详解与实践
  • 【Go】Go语言继承-多态模拟
  • Ubuntu 22.04 二进制安装单节点 MySQL
  • 1. Linux平台OA项目部署步骤
  • 记20个忘10个之八:前缀a-
  • 从头开始学C语言第三十一天——void指针和const指针
  • 表达式括号匹配(stack)(信息学奥赛一本通-1353)
  • 图论 | 岛屿数量(深搜,广搜)
  • 【动态规划】下降路径最小和
  • 【笔记分享】NCS/Zephyr 使能SPI SD卡方法介绍
  • C语言入门教程100讲(39)文件读写
  • 第二章 EXI协议原理与实现--8.4 对-2/-20所有命令的测试结果
  • JVM的组成及各部分的作用
  • 数据结构 -- 线索二叉树
  • 深度学习Python编程:从入门到工程实践
  • 看见“看得见的手”,看见住房与土地——读《央地之间》
  • 建行一季度净利833.51亿同比下降3.99%,营收降5.4%
  • 以“最美通缉犯”为噱头直播?光明网:违法犯罪不应成网红跳板
  • 美情报机构攻击中国大型商用密码产品提供商,调查报告公布
  • 伊朗港口爆炸已致40人死亡
  • 点燃“文化活火”,上海百年街区创新讲述“文化三地”故事