Skip to content
On this page

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

一对一

  1. 外键

    • 级联方式,也就是主表修改 id 或者删除的时候,从表怎么做

    CASCADE(关联删除或更新),SET NULL(关联外键设置为 null),RESTRICT 或者 NO ACTION(没有从表的关联记录才可以删除或更新)

  2. 表连接

    • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
    • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
    • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

一对多

我们创建了部门、员工表,并在员工表添加了引用部门 id 的外键 department_id 来保存这种一堆多关系

多对多

创建了文章表、标签表、文章标签表来保存多堆多关系,多对多不需要在双方保存彼此的外键,只要在中间表里维护这种关系即可。

中间表的外键级联方式一定为 CASCADE,因为数据没了关系就没必要还留着了。

此外,多对多的 join 需要连接 3 个表来查询。

  • 中间表的通过两个外键将两个表的主键连接,当任意一个主键删除,关系表就会因为 CASCADE 自动删除

子查询

sql
**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。