在数字化时代,数据库技术已成为我们日常生活和工作中不可或缺的一部分。无论是处理个人信息、管理企业数据,还是构建大型应用程序,数据库都发挥着核心作用。作为一个数据库开发者,我们不仅要掌握基本的数据库知识,还要了解如何高效地设计和维护数据库系统。这篇数据库开发手册正是为了帮助我更好地掌握数据库开发的各个方面而编写的。
提示:数据库规约内容引自阿里《java开发手册》
说明:此处只列出了一些常见的强制规约,详细请参考阿里开发手册原文
说明: MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写。因此,数据库名、表名、字段名,都不允许出现任何大写字母,避免节外生枝。正例: aliyun_admin,rdc_config,level3_name反例: AliyunAdmin,rdcConfig,level_3_name
说明: 表名应该仅仅表示表里面的实体内容,不应该表示实体数量,对应于 DO 类名也是单数形式,符合表达习惯。
说明: 在存储的时候,float 和 double 都存在精度损失的问题,很可能在比较值的时候,得到不正确的结果。如果存储的数据范围超过 decimal 的范围,建议将数据拆成整数和小数并分开存储。
说明: 其中 id 必为主键,类型为 bigint unsigned、单表时自增、步长为 1。create_time, update_time 的类型均为 datetime 类型。
说明: 任何字段如果为非负数,必须是 unsigned 。注意: POJO 类中的任何布尔类型的变量,都不要加 is 前缀,所以,需要在< resultMap >设置从 is_xxx 到 Xxx 的映射关系。数据库表示是与否的值,使用 tinyint 类型,坚持 is_xxx 的命名方式是为了明确其取值含义与取值范围。正例: 表达逻辑删除的字段名 is_deleted ,1 表示删除,0 表示未删除。
正例: alipay_task / force_project / trade_config
正例: 使用如下方式来避免 sum 的 NPE 问题:SELECT IFNULL(SUM(column), 0) FROM table;
说明: NULL 与任何值的直接比较都为 NULL 。
说明: 以学生和成绩的关系为例,学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。
说明: 1)增加查询分析器解析成本。2)增减字段容易与 resultMap 配置不一致。3)无用字段增加网络消耗,尤其是 text 类型的字段。
说明: 参见定义 POJO 类以及数据库字段定义规定,在中增加映射,是必须的。在MyBatis Generator 生成的代码中,需要进行对应的修改。
查询语法格式:[ ]中内容表示可写可不写根据情况决定
SELECT [DISTINCT] | 字段 [别名] [,字段 [别名]]
FROM 表名称 [别名]
[WHERE 条件(S)]
[group by 字段列表]
[having 函数方法判断]
[ORDER BY 字段 [ASC|DESC][ ,字段 [ASC|DESC], …]]
[LIMIT 开始索引,长度];
例如:(其中若月薪和奖金为null则用0替换参与计算)
-- - 查询所有员工的年薪((月薪 + 奖金) * 12) 。
SELECT ENAME,(IFNULL(MGR,0)+IFNULL(SAL,0))*12 as "年薪" FROM emp;
语法:
SELECT [DISTINCT] * | 字段 [别名] [, 字段 [别名], …]
FROM 表名称 [别名], [表名称 [别名], …]
[WHERE 条件(S)/消除笛卡尔积连接]
[ORDER BY 排序字段 [ASC|DESC] [, 排序字段 [ASC|DESC], …]];
语法:
SELECT 别名1.column,..., 别名2.column,...
FROM table1 别名1 [INNER] JOIN table2 别名2 ON 别名1.column1 = 别名2.column2
WHERE 查询判断条件
语法:
SELECT 别名1.column,..., 别名2.column,...
FROM table1 别名1 LEFT [OUTER] JOIN table2 别名2 ON 别名1.column1 = 别名2.column2
WHERE 查询判断条件
语法:
SELECT 别名1.column,..., 别名2.column,...
FROM table1 别名1
RIGHT [OUTER] JOIN table2 别名2 ON 别名1.column = 别名2.column
RIGHT [OUTER] JOIN table3 别名3 ON 别名3.column = 别名?.column
.......
WHERE 查询判断条件
DATE_FORMAT(date字段/字符串值, format)
-- 将字符串类型日期转为date类型日期
DATE_FORMAT('2023-11-06','%Y-%m-%d');
-- 将date类型日期转为字符串日期
DATE_FORMAT(NOW(),'%Y-%m-%d');
concat(x,y) 将提供的参数 x 和 y 拼接成一个字符串
模糊查询名字中有SMI的职员名字
SELECT emp.ENAME FROM emp WHERE ENAME LIKE CONCAT('%',"SMI",'%');
模式 | 表示 |
---|---|
^ | 匹配输入字符串的开始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的子表达式一次或多次 |
+ | 匹配前面的子表达式零次或多次 |
[0-9] | 匹配数字0-9 |
[...] | 匹配所包含的任意一个字符 |
[^...] | 匹配未包含的任意字符 |
SELECT 字段 FORM 表名 WHERE 字段 regexp 正则表达式
正则表达式使用例子:
emp表:
查询职业以S开头的员工姓名与工资信息:
SELECT emp.ENAME,emp.JOB,emp.MGR FROM emp WHERE JOB REGEXP "^S";
显示结果
查询名字是以N结尾的职员名称
SELECT emp.ENAME FROM emp WHERE ENAME REGEXP "N$";
查询雇员编号中0出现一次或一次以上的编号
SELECT emp.EMPNO FROM emp WHERE EMPNO REGEXP "0+";
查询结果:
查询职业中包含MAN的职业
SELECT emp.JOB FROM emp WHERE JOB REGEXP "MAN";
查询结果: