培训笔记:数据库

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语句的执行顺序:

  1. from
  2. where
  3. group by
  4. having
  5. select
  6. 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自动维护;

规定外键后,子表外键字段的数据范围将被约束;
父表与子表创建和删除的顺序也将受到约束;

了解不同引擎的优势和区别;

通过索引检索数据库,缩小了扫描的范围,提高了查询效率;
索引实际存在于数据库中,同样需要维护,因此需要经常修改的字段不适合添加索引;
适合添加索引的字段应具备以下特点:

  1. 数据量很大
  2. 很少被修改
  3. 常被作为筛选条件

受唯一约束的字段将被自动添加索引;
当一次查询的条件以通配符开头时,将无法使用索引;
索引的底层实现: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命令:导入和导出;

数据库设计的三范式:

  1. 确保存在主键、确保字段的原子性;
  2. 确保每个字段都依赖于主键;
  3. 确保每个字段都直接依赖于主键

根据第二范式,同一表内不应出现多对多关系,
当需要设计多对多关系时,将其拆分成三张表,例如:

  • 教师: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日晚上

数据库,讲师:-

  • 非功能性指标的重要性:决定用户的体验,却从不体现在需求中;

关键指标如下:

  1. 可扩展性

    • 纵向,例如强化原有的硬件;
    • 横向,例如增加新的硬件,是否支持横向扩展是本指标的关键,
      不可扩展的组件将成为产品发展的瓶颈
  2. 可用性

    • 架构应提供Failover(错误转移)能力,例如云;
    • 相对的有Failback(修复后返回);
    • 无论采用什么方案,都应保证Failsafe(失败安全),例如事务
  3. 可维护性

    • 文档、注释;
    • 程序设计的六大原则,例如开闭原则,新增功能时不改变原来的业务代码;
      六大原则很难同时满足,取舍的合理性依赖于编程经验的积累
  4. 备受关注的点,高性能

    • 客户的硬件不可控制,只能控制程序的性能;
    • 实现方法之一,多线程,其二,加缓存,可能已经由架构完成;
    • 其三,线程池、连接池等池化技术,让资源既不过载又不浪费;
    • 其四,避免直接操作数据库,尝试访问更高性能的缓存来代替,例如Redis
  5. 安全性、易用性等

  6. 其他经历

    • 理清编程思路,少怀疑系统、多怀疑自己;
    • 使用数据库索引,强化数据库设计以减少检索条件;
    • 测试环境与生产环境与服务器的字符集统一问题;
    • 申请的服务器资源量估算;
    • 读写分离设计等
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。