约束条件
1. NOT NULL 约束
创建表时,可以指定某列不为空。如果插入的数据为空则会报错。
本文介绍了 MySQL 数据库的核心知识点,涵盖表约束条件、表结构设计及高级查询方法。约束部分详细讲解了 NOT NULL、UNIQUE、DEFAULT、PRIMARY KEY、FOREIGN KEY 及 CHECK 约束的定义与用法。表设计部分阐述了一对一、一对多、多对多关系的建模方式。查询部分重点分析了聚合函数(COUNT、SUM、AVG 等)、GROUP BY 分组、HAVING 筛选、多表连接(内连接、外连接、自连接)、子查询以及 UNION 合并查询的语法与执行逻辑,并补充了 SQL 关键字执行顺序及注释规范。

创建表时,可以指定某列不为空。如果插入的数据为空则会报错。
CREATE TABLE 表名 (
列名 1 类型 NOT NULL,
列名 2 类型
);

创建表时某列使用 UNIQUE 时,插入数据必须唯一。如果插入相同的数据则会报错。
CREATE TABLE 表名 (
列名 1 类型 UNIQUE,
列名 2 类型
);

如果不指定 DEFAULT,默认为 NULL。DEFAULT 用于为列提供默认值。
CREATE TABLE 表名 (
列名 1 类型,
列名 2 类型 DEFAULT '默认值'
);

注意:查看表结构可使用
DESC 表名;,此处 DESC 指 DESCRIBE(描述);而 ORDER BY ... DESC 中的 DESC 指降序(DESCEND)。
一个表中只能有一个主键约束,用于身份标识。例如身份证号或学号。
CREATE TABLE 表名 (
列名 1 类型 PRIMARY KEY,
列名 2 类型
);

对于整数类型的主键,可以使用 AUTO_INCREMENT 自增(从 1 开始往上增加)。
CREATE TABLE 表名 (
列名 1 类型 PRIMARY KEY AUTO_INCREMENT,
列名 2 类型
);

外键约束描述两表之间的关联关系。子表通过父表约束。例如学生选课,课程必须是学校存在的。
前提: 两个表都必须存在主键,通过主键建立联系。指定外键时,父表中被关联的列必须是主键或唯一约束。
CREATE TABLE 子表名 (
列名 1 类型 (主键),
列名 2 类型,
FOREIGN KEY (列名 3) REFERENCES 父表名 (父表主键列名)
);


注意: 使用外键约束后,不能直接修改父表的值;若约束存在,不可先删除父表。


CHECK 约束限制列的值只能在特定范围内。
CREATE TABLE 表名 (
列名 1 类型 CHECK (列名 1 = '值 1' OR 列名 1 = '值 2'),
列名 2 类型
);

例如一个学生对应一个账号,一个账号对应一个学生。
student(student_Id VARCHAR(20), name VARCHAR(20), account_Id VARCHAR(20));
account(account_Id VARCHAR(20), username VARCHAR(20), password VARCHAR(20));
例如一个班级包含多个学生,但一个学生只能在一个班级中。
class(id INT, name VARCHAR(20));
student(id INT, name VARCHAR(20), class_Id INT);
例如一个学生选多门课,一门课被多个学生选。需通过中间表实现。
student(id INT, name VARCHAR(20));
course(id INT, course_name VARCHAR(20));
以上三种均为相关联表,无关联即无外键约束。
聚合查询针对行与行之间进行运算。
COUNT(*):统计总行数(包含空值)。COUNT(列名):统计该列非空行数。COUNT(DISTINCT 列名):去重且去空值计数。注意:COUNT 和括号之间有空格时会报错。
SUM(列名):数值列求和。
将多组数据按条件分成几组,常用于配合聚合函数计算每组的统计值。
语法顺序: WHERE 在 GROUP BY 之前。


HAVING 用于筛选分组后的结果,通常配合 GROUP BY 使用,且位于末尾。
示例:平均工资低于 8000 的部门。

多表联合查询涉及笛卡尔积,需通过条件筛选有效数据。
-- 基础写法
SELECT student.name, course.course
FROM student, course
WHERE student.id = course.student_id;
-- 推荐写法
SELECT student.name AS studentName, course.course AS courseCourse
FROM student INNER JOIN course ON student.id = course.student_id;





自己和自己做笛卡尔积,需注意别名区分。
SELECT * FROM 表 1 AS 新名 1 JOIN 表 1 AS 新名 2 ON 新名 1.id = 新名 2.id;

嵌入其他 SQL 语句中的 SELECT 语句。
SELECT name, class_id FROM student
WHERE class_id = (SELECT class_id FROM student WHERE name = '不想毕业')
AND name != '不想毕业';
SELECT score.student_id, score.score
FROM score
WHERE score.course_id IN (SELECT id FROM course WHERE name = '语文' OR name = '英文');
合并多个 SQL 查询结果集,列数和类型需一致。默认去重,可用 UNION ALL 保留重复。
SELECT 字段名 FROM 表 1 UNION SELECT 字段名 FROM 表 2;
SQL 关键字执行顺序:FROM > ON > JOIN > WHERE > GROUP BY > WITH > HAVING > SELECT > DISTINCT > ORDER BY > LIMIT
小知识:MySQL 注释可使用
#或--(双横线加空格)。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL 转 CSV/JSON/XML在线工具,online
CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online