Mysql
CRUD
高级
- where:查询条件,比如 where id=1
- as:别名,比如 select xxx as 'yyy'
- and: 连接多个条件
- in/not in:集合查找,比如 where a in (1,2)
- between and:区间查找,比如 where a between 1 and 10
- limit:分页,比如 limit 0,5
- order by:排序,可以指定先根据什么升序、如果相等再根据什么降序,比如 order by a desc,b asc
- group by:分组,比如 group by aaa
- having:分组之后再过滤,比如 group by aaa having xxx > 5
- distinct:去重
sql 还可以用很多内置函数:
- 聚合函数:avg、count、sum、min、max
- 字符串函数:concat、substr、length、upper、lower
- 数值函数:round、ceil、floor、abs、mod
- 日期函数:year、month、day、date、time
- 条件函数:if、case
- 系统函数:version、datebase、user
- 类型转换函数:convert、cast、date_format、str_to_date
- 其他函数:nullif、coalesce、greatest、least
一对一
外键
- 级联方式,也就是主表修改 id 或者删除的时候,从表怎么做
CASCADE(关联删除或更新),SET NULL(关联外键设置为 null),RESTRICT 或者 NO ACTION(没有从表的关联记录才可以删除或更新)
表连接
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
一对多
我们创建了部门、员工表,并在员工表添加了引用部门 id 的外键 department_id 来保存这种一堆多关系
多对多
创建了文章表、标签表、文章标签表来保存多堆多关系,多对多不需要在双方保存彼此的外键,只要在中间表里维护这种关系即可。
中间表的外键级联方式一定为 CASCADE,因为数据没了关系就没必要还留着了。
此外,多对多的 join 需要连接 3 个表来查询。
- 中间表的通过两个外键将两个表的主键连接,当任意一个主键删除,关系表就会因为 CASCADE 自动删除
子查询
**DELETE** **FROM** employee **WHERE** department_id = (
**SELECT** id **FROM** department **WHERE** name = '技术部'
);
sql 和 sql 可以组合来完成更复杂的功能,这种语法叫做子查询。
它还有个特有的关键字 EXISTS(和 NOT EXISTS),当子查询有返回结果的时候成立,没有返回结果的时候不成立。
子查询不止 select 可用,在 update、insert、delete 里也可以用。
事务
事务内的几条 sql 要么全部成功,要么全部不成功,这样能保证数据的一致性。
它的使用方式是 START TRANSACTION; COMMIT; 或者 ROLLBACK;
还可以设置 SAVEPOINT,然后 ROLLBACK TO SAVEPOINT;
事务还没提交的数据,别的事务能不能读取到,这就涉及到隔离级别的概念了。
一般就用默认的隔离级别就行,也就是 REPEATABLE READ。
基本上,只要写增删改的 sql,那都是要开事务的。
node 操作 mysql
我们学习了 Node 里操作数据库的两种方式:
一种是直接用 mysql2 连接数据库,发送 sql 来执行。
一种是用 ORM 库,比如 typeorm,它是基于 class 和 class 上的装饰器来声明和表的映射关系的,然后对表的增删改查就变成了对象的操作以及 save、find 等方法的调用。它会自动生成对应的 sql。