对于多个表多个字段进行查询、F12查看网页的返回数据帮助开发、数据库的各种查询方式(多对多、多表查询、子查询等)。

对于多个表多个字段进行查询、F12查看网页的返回数据帮助开发、数据库的各种查询方式(多对多、多表查询、子查询等)。

  • [一、 前端界面需要展现多个表的其中几个数据的多表查询。](#一、 前端界面需要展现多个表的其中几个数据的多表查询。)
    • [1. 三个表查询其中字段返回:(用一下sql语句)](#1. 三个表查询其中字段返回:(用一下sql语句))
    • [2. 进行封装实体类,返回前端](#2. 进行封装实体类,返回前端)
    • [3. 如果前端需要在一个表单里面插入或者修改多个表,我们可以这样做:](#3. 如果前端需要在一个表单里面插入或者修改多个表,我们可以这样做:)
  • 二、按F12然后查看cook中的接口
    • [1 查看请求方式](#1 查看请求方式)
    • [2 查看封装的属性、状态值等信息](#2 查看封装的属性、状态值等信息)
  • 三、数据库各种查询(黑马):示例和代码
    • [1 多对多](#1 多对多)
    • [2 一对一](#2 一对一)
    • [3 如果我们直接查询两张表会出现迪卡效应(把两张表进行乘机配对)](#3 如果我们直接查询两张表会出现迪卡效应(把两张表进行乘机配对))
    • [4 通过两个id来查询两个表](#4 通过两个id来查询两个表)
    • [5 多表查询的概述:](#5 多表查询的概述:)
    • [6 内连接(查询公共字段)](#6 内连接(查询公共字段))
    • [7 外连接(左、右连接):(查询左、右边的数据库和公共的部分)](#7 外连接(左、右连接):(查询左、右边的数据库和公共的部分))
    • [8 自连接(把一个表,通过别名弄成两个表,来查询自己表的数据)](#8 自连接(把一个表,通过别名弄成两个表,来查询自己表的数据))
    • [9 自连接+左连接](#9 自连接+左连接)
    • [10 联合查询 union all全部合并,union 去重后合并](#10 联合查询 union all全部合并,union 去重后合并)
    • [11 子查询(嵌套查询)](#11 子查询(嵌套查询))
    • [12 标量子查询(先查询出一个,然后其他表通过这一个作为条件继续查)](#12 标量子查询(先查询出一个,然后其他表通过这一个作为条件继续查))
    • [13 列子查询(先查出一列的数据,然后被用作条件查询)](#13 列子查询(先查出一列的数据,然后被用作条件查询))
    • [14 行子查询(查出一行,作为其他查询的条件)](#14 行子查询(查出一行,作为其他查询的条件))
    • [15 表子查询(查出一个表,作为其他查询的条件)](#15 表子查询(查出一个表,作为其他查询的条件))

一、 前端界面需要展现多个表的其中几个数据的多表查询。

1. 三个表查询其中字段返回:(用一下sql语句)

假设有三张表:table1,table2 和 table3,它们的结构如下:

table1 包含字段:id, name, description, created_at, updated_at

table2 包含字段:id, table1_id, field1, field2, field3

table3 包含字段:id, table2_id, value1, value2, value3

现在我们需要从这三张表中查询:

table1 的 name 和 description 字段

table2 的 field1 和 field2 字段

table3 的 value1 和 value2 字段

csharp 复制代码
SELECT t1.name, t1.description, t2.field1, t2.field2, t3.value1, t3.value2
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.table1_id
JOIN table3 t3 ON t2.id = t3.table2_id;

2. 进行封装实体类,返回前端

老师带我观察页面前端我发现,他们返回的都是一个List列表,然后把需要返回的封装为一个实体类,再返回前端。强烈建议,一定要通义属性的命名,不然当你写这个实体类的时候,超级痛苦!!!

3. 如果前端需要在一个表单里面插入或者修改多个表,我们可以这样做:

如果前端需要将学生和老师的信息一起打包传到后端,你可以扩展现有的Spring Boot 应用程序,使其能够接收包含学生和老师信息的表单数据。以下是如何修改现有的示例代码以支持这种功能:

前端数据结构:前端需要将学生和老师的信息打包成一个结构,并以JSON格式发送到后端。例如:

csharp 复制代码
{
    "student": {
        "id": "123",
        "name": "Alice",
        "age": 20,
        "sex": "Female"
    },
    "teacher": {
        "name": "Mr. Smith",
        "position": "Math Teacher",
        "teachingExperience": 10
    }
}

后端处理:修改后端的控制器,以接收包含学生和老师信息的请求体,并分别处理学生和老师信息的新增或更新操作。

csharp 复制代码
// Endpoint to add or update student and teacher information together
@PostMapping("/addStudentTeacher")
public String addOrUpdateStudentAndTeacher(@RequestBody StudentTeacherForm form) {
    // Update or add student
    Student student = form.getStudent();
    boolean studentExists = students.stream().anyMatch(s -> s.getId().equals(student.getId()));

    if (studentExists) {
        students.stream()
                .filter(s -> s.getId().equals(student.getId()))
                .forEach(s -> {
                    s.setName(student.getName());
                    s.setAge(student.getAge());
                    s.setSex(student.getSex());
                });
    } else {
        students.add(student);
    }

    // Update or add teacher
    Teacher teacher = form.getTeacher();
    boolean teacherExists = teachers.stream().anyMatch(t -> t.getName().equals(teacher.getName()));

    if (teacherExists) {
        teachers.stream()
                .filter(t -> t.getName().equals(teacher.getName()))
                .forEach(t -> {
                    t.setPosition(teacher.getPosition());
                    t.setTeachingExperience(teacher.getTeachingExperience());
                });
    } else {
        teachers.add(teacher);
    }

    return "Student and Teacher information updated or added successfully.";
}

// Form class to wrap student and teacher information
static class StudentTeacherForm {
    private Student student;
    private Teacher teacher;

    // Getters and setters
    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }

    public Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }
}

表单处理:在前端,确保表单可以将学生和老师的信息合并成一个JSON对象,并通过POST请求发送到/api/addStudentTeacher端点。

通过这种方式,你可以实现将学生和老师的信息一起更新或新增到后端数据库。记得根据实际情况添加数据验证、异常处理和安全性措施,以确保应用程序的稳定性和安全性。
StudentTeacherForm 类是为了方便处理前端发送的包含学生和老师信息的请求而设计的,它通过两个属性 student 和 teacher 分别表示学生和老师的信息。

二、按F12然后查看cook中的接口

1 查看请求方式

2 查看封装的属性、状态值等信息

三、数据库各种查询(黑马):示例和代码

1 多对多

2 一对一

3 如果我们直接查询两张表会出现迪卡效应(把两张表进行乘机配对)

4 通过两个id来查询两个表

5 多表查询的概述:

6 内连接(查询公共字段)



7 外连接(左、右连接):(查询左、右边的数据库和公共的部分)


8 自连接(把一个表,通过别名弄成两个表,来查询自己表的数据)


9 自连接+左连接

10 联合查询 union all全部合并,union 去重后合并


11 子查询(嵌套查询)

12 标量子查询(先查询出一个,然后其他表通过这一个作为条件继续查)


13 列子查询(先查出一列的数据,然后被用作条件查询)




14 行子查询(查出一行,作为其他查询的条件)

15 表子查询(查出一个表,作为其他查询的条件)


相关推荐
云服务器租用费用12 小时前
2026年腾讯云OpenClaw(Clawdbot)+Skills云上部署及Windows本地集成轻松入门
运维·服务器·数据库·windows·云计算·腾讯云
AllData公司负责人12 小时前
大模型赋能AllData数据中台,系列升级|通过联合智谱大模型与BiSheng开源项目,建设企业大模型应用开发平台,支持知识库向量检索!
大数据·数据结构·数据库·算法·大模型·向量数据库·智谱ai
Raink老师12 小时前
【AI面试临阵磨枪-94】Skill 安全:注入、越权、数据泄露、恶意代码、沙箱?
数据库·安全·面试
程序员二叉13 小时前
【Redis】 缓存三大问题 + 大Key/热Key 全面解析
数据库·redis·缓存
mit6.82413 小时前
Agent Memory Management
数据库·人工智能
We Just Keep growing13 小时前
【MySQL进阶篇】—— 视图、存储过程、存储函数、触发器
数据库·mysql
梦想的颜色14 小时前
MySQL 数据存储结构与查询执行生命周期深度解析
运维·数据结构·数据库·mysql·线程·优化
电商API_1800790524714 小时前
免 TOP 入驻,第三方淘宝商品详情 API 快速接入与代码示例
java·大数据·开发语言·数据库·爬虫·数据分析
神龙斗士24014 小时前
增删改查操作
数据库·mysql
Elastic 中国社区官方博客15 小时前
13.7万人,零人工决策:使用 Elasticsearch 实现智能体驱动的灾害响应系统
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索