欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-11-21 19:55:10
count(*)和count(colname)的区别,前者会包含null的数据行,而后者会得到非null的数据行数 聚合函数会将null排除,即在sum,avg等聚合函数都是排除了null数据行的...

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还是会对中的数据生效的 隔离性 事务之间相互隔离,在一个事务还没有结束之前,对于其他事务是不可见的,如一个事务中对数据库插入一条数据在提交之前,其他的事务是看到这条新增加的记录的 持久性 一旦事务提交或者回滚就会对数据库生效,保证在该时间点的状态被保存