8月17日上午
数据库,讲师:-
- 演示了MySQL在本机的部署和检测、数据库的创建和删除;
- 演示了MySQL多种基本查询语句的使用规范和注意事项,
并随时将教学内容记入笔记中
为查询结果赋别名时,如果为中文,应加单引号;
MySQL支持双引号,但其他数据库通常不支持,因此不建议使用;
Where查询中默认and优先于or,要改变条件组合的优先级应使用括号;
in的效果等同于or,而非between;
转义符“\”,代表其后的字符为实际字符而非关键字;
分组函数(count、sum、avg、min、max)会自动忽略Null;
有Null参与的运算,结果均为Null,要避免这种情况,
需使用空处理函数“ifNull('字段名', 0)”将空值转化为零;分组函数不可以直接使用在Where子句当中
8月17日下午
数据库,讲师:-
- 总结上午讲述的内容;
- 演示MySQL分组查询和连接查询语句的使用,并随时将教学内容记入笔记中
分组函数不可以直接使用在Where子句当中的原因:
group by子句是在where子句后才进行的,要对分组结果进行筛选,应采用having;
Sql语句的执行顺序:
- from
- where
- group by
- having
- select
- order by
分组后,再尝试选取分组前的细节内容是没有意义的,MySQL允许这种行为,但在其他数据库将会报错;
当一条Sql语句中有Group By时,Select后面只能跟分组函数和参与分组的字段
Group By后接多个字段时,将多个字段视为同一个字段进行分组,
即仅当两个字段完全相同,才将结果视为一组;
Group By的去重关键字:distinct,只能出现在所有查询结果的最前面
关键点:连接查询
连接时应为表赋别名,以当表字段重名时,提升执行效率和可读性;
当进行自连接时,为每个表指定别名是必需的;
过滤行为发生在笛卡尔乘积动作后,因此不会减少记录的匹配次数;
推荐采用SQL99的连接书写方式——使用join和on,
其优势在于,分离了on和where筛选条件,使得连接动作表现得更加清晰,便于理解和后续操作;select e.ename, d.dname from emp e inner join dept d on e.deptno = d.deptno where e.sal > 3000
外连接与内连接的区别在于——
参与内连接的表是平等的,不匹配的记录不会出现在结果当中;
而外连接强调主从之分,不论是否匹配,主表中的所有数据都会出现在结果当中,
当无法正常匹配时,副表将提供Null与之匹配;
多表查询,采用前面的连接结果继续join新表,用on设定连接条件,形如:
select ... from t0
join t1 on ...
join t2 on ...
...
8月17日晚上
数据库,讲师:-
- 自习:复习白天的内容,
参考老师提供的笔记,在本地数据库中重现数据库操作,
按照上课提出的不同解决方案(合理或不合理),分析其优缺点或存在问题的原因
8月18日上午
数据库,讲师:-
- 讲解MySQL服务卸载的要点(清空残留才能正常重装),按教师笔记复习昨天的内容;
- 演示MySQL子查询和分页查询的使用,并随时将教学内容记入笔记中
MySQL服务卸载后,还需要手动删除的残留文件位于C盘:
Program Files(x86) 和隐藏的文件夹 ProgramData;
删除其中名为“MySQL”的文件夹即可;
子查询可以出现在的位置:
select ...(select)
from ...(select)
where ...(select)
使用union可将查询结果拼接,字段名以前者为准;
分页查询时用到的limit,可取结果集中的部分记录,是MySQL特有的关键字,在Oracle中通过类似的rownum来实现;
Limit是SQL语句执行的最后环节,在order by之后;limit的语法结构为:limit '起始索引 (从0起)', '长度'
从标准分页参数转到查询语句:定义pageNum页码,pageSize每页记录数,则查询形式为:
limit (pageNum - 1) * pageSize, pageSize
至此MySQL查询语句已全部讲解完毕,接下来学习数据表的创建和插入语句
MySQL的数据类型,当字符串长度固定时可用更高效的char型,否则应使用varchar型;
除常见的数据类型外,MySQL还支持:Blog:二进制大对象,常用于存储图片、视频等流媒体信息;
Clog:字符集大对象,用于存储大型文本;
创建表前常用的指令——若存在则删除表:
drop table if exists '表名';
从查询结果创建表,将查询结果插入表:
create table '表名' as select ...
insert into '表名' select...使用delete删除记录,不会删除表本身;
更新表:update '表名' set '字段1' = '值1', '字段2' = '值2', ... where '条件'
一般不会修改已有表的结构,在项目开始后再修改成本较高,建议使用可视化工具完成
8月18日下午
数据库,讲师:-
- 总结上午讲述的内容;
- 演示MySQL约束、存储引擎、索引和视图,并随时将教学内容记入笔记中;
MySQL的主键,第一范式要求,任何表都应有主键;
推荐使用单一的、自然的主键;不推荐使用联合的、业务的主键;MySQL的自增,使用列级约束“Auto_increment”;
使用后新建记录时可以不填写主键,交给MySQL自动维护;
规定外键后,子表外键字段的数据范围将被约束;
父表与子表创建和删除的顺序也将受到约束;
了解不同引擎的优势和区别;
通过索引检索数据库,缩小了扫描的范围,提高了查询效率;
索引实际存在于数据库中,同样需要维护,因此需要经常修改的字段不适合添加索引;
适合添加索引的字段应具备以下特点:
- 数据量很大
- 很少被修改
- 常被作为筛选条件
受唯一约束的字段将被自动添加索引;
当一次查询的条件以通配符开头时,将无法使用索引;
索引的底层实现:B+Tree;
视图的创建与删除:
create view '视图名' as select ...
drop view '视图名'对视图中数据的修改将会作用到原表
8月18日晚上
数据库,讲师:-
- 自习:复习白天的内容,
参考老师提供的笔记,在本地数据库中重现数据库操作,
按照上课提出的不同解决方案(合理或不合理),分析其优缺点或存在问题的原因
8月19日上午
数据库,讲师:-
- 按教师笔记复习昨天的内容;
- 演示MySQL事务的使用,并随时将教学内容记入笔记中;
- 演示文档中作业34题的解题过程,与同学共同完成
事务:一个完整的、不可拆分的业务逻辑单元,用于保证数据的完整性和安全性;
只有DML(insert、delete和update)语句需要使用事务机制;
启动事务后,操作不会直接修改数据,而是保存到记录当中;
当调用commit提交、或rollback回滚,表示事务完成并清空记录后,才执行数据的修改;
MySQL会自动提交事务;开启事务的写法为:start transaction;
事物的特性:原子性、一致性、隔离性和持久性(ACID);
分别演示事务的不同隔离级别之效果:读未提交、读已提交、可重复读和序列化读;
介绍DBA命令:导入和导出;
数据库设计的三范式:
- 确保存在主键、确保字段的原子性;
- 确保每个字段都依赖于主键;
- 确保每个字段都直接依赖于主键
根据第二范式,同一表内不应出现多对多关系,
当需要设计多对多关系时,将其拆分成三张表,例如:
- 教师:TNo (pk), TName
- 学生:SNo (pk), SName
- 关系:Id (pk), TNo (fk), Sno (fk)
根据第三范式,同一表内不应出现一对多关系,
当需要设计一对多关系时,将其拆分成两张表,例如:
- 班级:CNo (pk), CName
- 学生:SNo (pk), SName, Cno (fk)
三范式的应用不能脱离实际需求,
如上例中若需要经常查询学生姓名与班级名的组合,
则应当将两张表合并来提高查询效率,不可拘泥于规范
讲解内容至此结束,接下来演示作业34题的解题过程
8月19日下午
数据库,讲师:-
- 播放教学视频,讲解MySQL服务和Navicat管理工具的安装;
- 播放教学视频,讲解JDBC的部署和Java连接数据库操作中的安全设置
8月19日晚上
数据库,讲师:-
- 非功能性指标的重要性:决定用户的体验,却从不体现在需求中;
关键指标如下:
-
可扩展性
- 纵向,例如强化原有的硬件;
- 横向,例如增加新的硬件,是否支持横向扩展是本指标的关键,
不可扩展的组件将成为产品发展的瓶颈
-
可用性
- 架构应提供Failover(错误转移)能力,例如云;
- 相对的有Failback(修复后返回);
- 无论采用什么方案,都应保证Failsafe(失败安全),例如事务
-
可维护性
- 文档、注释;
- 程序设计的六大原则,例如开闭原则,新增功能时不改变原来的业务代码;
六大原则很难同时满足,取舍的合理性依赖于编程经验的积累
-
备受关注的点,高性能
- 客户的硬件不可控制,只能控制程序的性能;
- 实现方法之一,多线程,其二,加缓存,可能已经由架构完成;
- 其三,线程池、连接池等池化技术,让资源既不过载又不浪费;
- 其四,避免直接操作数据库,尝试访问更高性能的缓存来代替,例如Redis
安全性、易用性等
-
其他经历
- 理清编程思路,少怀疑系统、多怀疑自己;
- 使用数据库索引,强化数据库设计以减少检索条件;
- 测试环境与生产环境与服务器的字符集统一问题;
- 申请的服务器资源量估算;
- 读写分离设计等