目录
如果不是主键
如果不是主键,这时表明会有重复的行,这时一定要去重,可以用distinct和group by 去重
avg和round这类函数针对的是单纯的数字
你在给一堆数字求平均值的时候,千万不要在里面再给这堆数字重新命名
例如
avg((case when activitytype=‘start’ then -tiemstamp else timestamp end) as res)
这条语句是错误的,因为你在avg里面给这堆数字命名了。avg面对的一列中的数字,所以千万不要在这里面重命名,不然他就不是在给数字就平均值了,而是给列名求平均值了
case when … then … else… end
记住,这个case when then语句是另加一列的,并不是在现有的数据表中的某一列进行修改,
是另加一行的,是另加一行的,是另加一行的,是另加一行的,是另加一行的,是另加一行的,是另加一行的,是另加一行的,是另加一行的,是另加一行的
oder by id 排序
order by id这时最后才排序的,执行顺序在最后
用left join
用left join时,是必然有结果的,但是有的时候,你在联合两张表的时候,可能第二张表是空的,因此如果你还是用left join的话,那还是有结果的,因此此时必须要自连接比较好
ifnull()方法
ifnull(A, B)
如果A为null则返回B的内容
如果A不为NULL 则直接返回A 的内容
什么时候用自连接呢?
当同一个段内的记录需要比较大小时,或者同一个段内的不同记录间要进行某些操作时,这时可以用 select * from 表A as a,表A as b,这样每一行与其他行都对应起来了,然后就可以操作了
left join 中on 和 where的区别
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。 在使用left jion时,on和where条件的区别如下:
1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
distinct关键字
从上例中可以发现,当distinct应用到多个字段的时候,其应用的范围是其后面的所有字段,而不只是紧挨着它的一个字段,而且distinct只能放到所有字段的前面,如下语句是错误的:
SELECT country, distinct province from person; // 该语句是错误的
select关键字
mysql中select关键字其实就相当于Java中的sout打印一样,是一个输出显示的作用,后面的as只是给输出的内容起了个列名。select后面的内容就是纯内容, 而内容后面as 只是给这个纯内容起了一个别名,这个字段名
过滤日期
用between … and … 日期用双引号
between “2019-06-28” and “2019-07-27”
delete from 关键字删除
delete from 后面接表名 再后面接where语句
对同一张表进行自连接
相同的一张表进行自连接的时候,一定要另外取一个别名,如果是相同的两个名字就直接自连接是会报错的
比如
select * from 表A,表A;这样是会报错的
select * from 表A as A, 表A as B; 这样就是对的
if…语句和case … when…语句
if是一个函数,既然是函数就有一个返回值,其返回值不是表达式2,就是表达式3
UNION ALL
且之后形成的表的字段名是以第一个select语句为准
dateDiff关键字
datediff函数里面是两个日期,返回值是相隔的天数