SQL基础教程之count(*)和count(colName)的区别介绍

count(*)和count(colname)的区别,前者会包含null的数据行,而后者会得到非null的数据行数

聚合函数会将null排除,即在sum,avg等聚合函数都是排除了null数据行的

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

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子句之前

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

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

update tablename set colname1=.. , colname2 = .. where …

update tablename set (colname1,colname2) = (x1,x2) where …

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

事务就是需要在用一个处理单元中执行的一系列的更新处理的集合,在标准的sql中并没有规定事务开启的语句是什么,在mysql中为start transaction,事务结束的语句一般是commit或者rollback两种

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

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

直到用户commit或者rollback为止算一个事务

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

acid特性

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

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐