1. 什么是聚合函数,常见的聚合函数有哪些?

什么是聚合函数?

聚合函数(Aggregate Function) 是 SQL 中用于对一组值进行计算并返回一个单一值的函数。它们通常与 GROUP BY 子句一起使用,用来对数据进行分类汇总。

聚合函数最常见的用途包括:

  • 求和

  • 平均值

  • 统计数量

  • 最大值/最小值

  • 统计不同值的数量等


常见的聚合函数(以 MySQL 为例)

聚合函数

功能说明

COUNT()

统计行数或非 NULL 值的数量

SUM()

对某一列求和

AVG()

计算某一列的平均值

MAX()

返回某一列的最大值

MIN()

返回某一列的最小值

GROUP_CONCAT()

将多行数据合并为一个字符串(MySQL 特有)

STD() / STDDEV()

计算标准差

VAR_POP() / VAR_SAMP()

计算总体/样本方差


2. 解释查询语句中的关键字分别有什么作用,FROM、JOIN、WHERE、GROUP BY、ORDER BY、HAVING、SELECT、DISTINCT、LIMIT。

执行顺序

关键字

说明

1

FROM / JOIN

确定数据来源和连接方式

2

WHERE

过滤原始数据,筛选符合条件的行

3

GROUP BY

对数据进行分组

4

HAVING

过滤分组后的结果

5

SELECT

选择需要返回的字段

6

ORDER BY

对结果进行排序

7

LIMIT

限制返回的行数



3. 什么是窗口函数,有哪些使用场景

窗口函数(Window Function) 是一种在 SQL 中用于对一组相关行进行计算的函数,与传统的聚合函数不同的是:

它不会将多行数据合并为一行,而是为每一行返回一个结果。

这种函数非常适合在不丢失原始数据的情况下进行分组统计、排名、累计计算等操作。


4. 什么是内连接、左连接、右连接、全连接,MySQL不支持哪个

连接类型

MySQL 是否支持

说明

INNER JOIN

✅ 支持

最常用

LEFT JOIN

✅ 支持

返回左表全部记录

RIGHT JOIN

✅ 支持

返回右表全部记录

FULL JOIN

❌ 不支持

需要通过 LEFT JOIN + RIGHT JOIN + UNION 模拟实现


5. 什么是子查询/嵌套查询

子查询 vs 连接查询(JOIN)

特点

子查询

JOIN

可读性

更清晰直观,适合简单嵌套逻辑

更高效,适合复杂关联

性能

可能效率较低(尤其未优化时)

通常性能更好

应用场景

小数据量、逻辑清晰的查询

大数据量、需要高性能的连接操作



6. mysql中的一对一,多对一,多对多的关系如何设计

关系类型

描述

设计方法

示例

一对一

一条记录 → 另一条记录

添加外键并设置 UNIQUE

用户 ↔ 用户档案

多对一

多条记录 → 一条记录

在“多”方加外键

学生 → 小组

多对多

多条记录 ↔ 多条记录

创建中间表

学生 ↔ 课程


7. 学生与学籍号,学生与班级,学生与老师,应该如何设计其表关系(一对一、多对一、多对多),给出建表语句,并对每一行内容进行说明。

关系类型

表结构描述

实现方式

学生 ↔ 学籍号

一对一

添加外键并设置 UNIQUE

学生 ↔ 班级

多对一

在“学生”表中添加“班级”外键

学生 ↔ 老师

多对多

创建中间表,并建立双方向外键

一个学生只能有一个学籍号,并且是独有的。
一个班级能有多个学生。

一个老师能有多个学生,一个学生能有多个老师。


8. 比如在学生与学籍号中,外键应该放在哪个表中,为什么

学籍号,因为一个学生只能有一个学籍号。


9. mysql支持哪些外键级联操作,分别有什么作用

级联操作

语法关键字

作用说明

CASCADE

ON DELETE CASCADE<br>ON UPDATE CASCADE

当主表记录被删除或更新时,自动删除或更新从表中的相关记录。

SET NULL

ON DELETE SET NULL<br>ON UPDATE SET NULL

当主表记录被删除或更新时,将从表中的外键字段设为 NULL(前提是该字段允许 NULL)。

NO ACTION

ON DELETE NO ACTION<br>ON UPDATE NO ACTION

不做任何操作(等同于 RESTRICT),如果从表中有引用,则禁止删除或更新主表记录。

RESTRICT

ON DELETE RESTRICT<br>ON UPDATE RESTRICT

默认行为。如果从表中存在关联记录,禁止删除或更新主表记录。


10. 什么是中间表/关联表,有什么使用场景

什么是中间表 / 关联表?

中间表(也叫关联表) 是用于实现 多对多(Many-to-Many)关系 的一种数据库结构。

它本身不存储实际业务数据,仅用于记录两个或多个表之间的 关联关系


中间表的结构特点

  • 通常由两个或多个外键组成;

  • 每个外键分别指向一张主表的主键;

  • 可以设置联合主键(Composite Primary Key)或使用自增主键 + 唯一索引;

  • 不包含额外的业务字段(也可以有,如“创建时间”、“状态”等);


11. 如何设计一个表,比如设计一个学生选课系统。那么最少需要创建几个表,每个表中最少几个字段,分别用于记录什么内容。给出完整的建表命令。

设计说明:

  1. 学生表(students):存储学生的基本信息,其中 student_id 是主键,确保每个学生都有唯一的标识。

  2. 课程表(courses):存储课程的基本信息,其中 course_id 是主键,确保每门课程都有唯一的标识。

  3. 选课记录表(enrollments):存储学生选课的具体信息,其中 enrollment_id 是主键,student_idcourse_id 是外键,分别关联到学生表和课程表,以确保数据完整性。

1. 学生表 students

  • student_id:学生的唯一标识(主键)。

  • name:学生的姓名。

  • email:学生的邮箱。

CREATE TABLE students (
    student_id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE
);

2. 课程表 courses

  • course_id:课程的唯一标识(主键)。

  • course_name:课程的名称。

  • instructor:授课教师的姓名。

CREATE TABLE courses (
    course_id INT PRIMARY KEY AUTO_INCREMENT,
    course_name VARCHAR(100) NOT NULL,
    instructor VARCHAR(100)
);

3. 选课记录表 enrollments

  • enrollment_id:选课记录的唯一标识(主键)。

  • student_id:关联学生表的外键。

  • course_id:关联课程表的外键。

  • enrollment_date:选课的时间。

CREATE TABLE enrollments (
    enrollment_id INT PRIMARY KEY AUTO_INCREMENT,
    student_id INT,
    course_id INT,
    enrollment_date DATE,
    FOREIGN KEY (student_id) REFERENCES students(student_id),
    FOREIGN KEY (course_id) REFERENCES courses(course_id)
);

以他人的幸福为幸福,以他人的享乐为享乐。