数据库
语句类型
- DDL: 数据库定义语言.对数据库结构的增删改查
- DML 数据库管理语言.对表内容的增删改查
- DCL 数据库控制语言.事务,用户等
- DQL 数据库查询语言 oracle数据库有默认的几张表,可以用于练习sql语句的书写
语句
数据类型;
- char, varchar, date, number
创建表, 对每个列进行约束:
- 默认值,主键,外键,非空
锁
- 悲观锁
- 共享锁 s
- 排它锁 e
- 更新锁:和共享锁兼容.和排它锁互斥.为了解决死锁,可以升级为排它锁
- 意向锁:在为某行加排他锁时,顺便为表加了意向排他锁.避免以后再加排它锁时的逐行检查
- 乐观锁:
- 时间戳
如何加锁,何时加锁,加什么锁,你可以通过hint手工强行指定,但大多是数据库系统自动决定的。
- 时间戳
锁的粒度就是指锁的生效范围,就是说是行锁,还是页锁,还是整表锁. 锁的粒度同样既可以由数据库自动管理,也可以通过手工指定hint来管理。
如何提高并发效率
悲观锁:利用数据库本身的锁机制实现。通过上面对数据库锁的了解,可以根据具体业务情况综合使用事务隔离级别与合理的手工指定锁的方式比如降低锁的粒度等减少并发等待。 乐观锁:利用程序处理并发。原理都比较好理解,基本一看即懂。方式大概有以下3种 对记录加版本号. 对记录加时间戳.
DML
增加:
- insert into <table> values (col1,col2,…)
删除:
- drop table
# 直接删除表的定义,删除结构 - drop database
- delete * from
# 删除数据
改:
- alter table student drop age # 更改结构
- update
set = where ... # 更改数据,中间可以有select语句
查:
select dept_name dname, job
from table1, table2
where deptno in (select deptno from dept)
group by deptno
having avg(sal)>2000
order by desc;
为表起别名, 自查询,多表联合查询,分组查询,嵌套查询(select可以出现在任何地方)
查询分类
- 子查询
- 技巧: - 重命名 - in (select * from [])
- 连接查询(暴力破解)
- 内连接
- 外连接.左连接,右连接
- 全连接
- 集合查询
- union
- intersect
- minus
- except 4.聚集查询/分组查询
核心:
- 模块化,分治法
- 对问题的重新定义,对业务的理解
# mysql in manjaro-linux
使用: sudo systemctl restart mysqld
mysql -u root -p;
先选择数据库: use
command
- desc table_name; 查看表结构
- show databases;
- show tables;
- source file.sql;
- commit;
复习重点
语句执行顺序
事务
ACID特性。其他三个都是为了保证一致性
三种不考虑隔离性的结果现象
四种隔离级别
事务要么全提交,要么回滚。是原子性的体现。
JDBC
三个范式
- 1NF: 原子性,去除多值,只要是RDBMS的表,就满足
- 2NF: 非主属性对主属性完全函数依赖.如果主属性只有一个,则一定是2NF
候选码的属性都是主属性,主码是候选码中的一个
- 3NF: 非主属性之间无函数依赖关系,去除了非主属性和主属性之间的传递依赖
- BCNF: 去除了主属性之间的部分函数依赖和传递依赖. 原因:存在多个候选码.所有函数依赖决定因子都是主键
根本目的:将表划分的更加细致,而不是一张大表.尽量减少数据的冗余,方便增删改
代码优化
省略机器运行步骤,写出高效程序
- 避免使用select *, 因为oracle会查询数据字典,转换为列名
- 将sql关键字写为大写。因为oracle会先将关键字变为大写。
- where和having都是从右到左,尽量少用having. 明白数据是如何层层过滤的,底层实现
知识点
判断
- null: 是一种状态;判断:is null
- 模糊匹配:where colname like ‘_i%’
- 精确:=
ER图 ==> 表
- 实体分为强实体和弱实体.弱实体依赖于强实体,所以,弱实体对应的表包含强实体的外键
- 关系
- 1:n/1:1, 直接在某个实体对应的表中加入外键即可
- m:n, 需要创建额外的关系表,创建主键外键
- 递归关系类似普通关系,只有在m:n时,进行关系表的创建
反规范化的思想
规范化减少了数据冗余,易于保证数据的完整性,也可能导致数据库性能降低. 所以,可以适当地数据冗余