SQL基础教程读书笔记

  1. count(*)和count(colName)的区别,前者会包含NULL的数据行,而后者会得到非NULL的数据行数

  2. 聚合函数会将NULL排除,即在SUM,AVG等聚合函数都是排除了NULL数据行的

  3. group by中如果聚合键包含NULL时,在结果中会以空行的形式表现出来

  4. group by的常见错误

    • 在select中出现了多余的列,标准的SQL中使用了group by后select后面只能出现 常数 聚合函数 group by后出现的列名,但是在mysql中可以出现其他的列名,通常是以分组的第一行的数据列返回的,但是不推荐这样的写法

    • group by 中出现了别名,因为别名通常是在select子句中定义的,而select子句的执行在group by后,所以这样的写法是不规范的(虽然在有些DBMS中不会报错)

    • group by返回的结果是随机顺序的

    • 在where子句中使用聚合函数是错误的,因为select子句和having子句可以使用聚合函数,聚合函数的计算是在group by以后,而where子句的执行是在group by子句之前

  5. 标准SQL中删除数据只能使用delete,但是在一些DBMS中出现了truncate语句,truncate用来删除表的全部数据但是保留表的结构,速度比delete子句要快,delete语句可以使用where限定删除数据行的范围

  6. update语句可以同时更新多个数据列,有两种方法

    • update tableName set colName1=.. , colName2 = .. where …

    • update tableName set (colName1,colName2) = (x1,x2) where …

    前者是标准的写法,后者在部分DBMS中不被支持

  7. 事务就是需要在用一个处理单元中执行的一系列的更新处理的集合,在标准的SQL中并没有规定事务开启的语句是什么,在MySQL中为START TRANSACTION,事务结束的语句一般是COMMIT或者ROLLBACK两种

    在无需明确指定事务开始时间的DBMS中如何区分各个事务:

    • 每个SQL都是一个事务(自动提交模式)

    • 直到用户COMMIT或者ROLLBACK为止算一个事务

    通常的DBMS都会选择其中的一种方式,使用自动提交模式的如MySQL,SQL Server和PostgreSQL等,在执行sql的时候都会在sql的前后插入start transaction 和 commit语句

  8. ACID特性

    • 原子性 多个更新操作要么全部成功要么全部失败
    • 一致性 如修改非空约束的列为NULL导致sql无法执行,那么这条不合法的sql就不会生效,其他sql还是会对数据库中的数据生效的
    • 隔离性 事务之间相互隔离,在一个事务还没有结束之前,对于其他事务是不可见的,如一个事务中对数据库插入一条数据在提交之前,其他的事务是看到这条新增加的记录的
    • 持久性 一旦事务提交或者回滚就会对数据库生效,保证在该时间点的状态被保存

猜你喜欢

转载自blog.csdn.net/u012557610/article/details/80189210
今日推荐