1、sql语句执行顺序git
2、如何获取表记录,或者某字段不一样值个数sql
select 数据库
count(distinct a.user_id) as cntexpress
from table a函数
3、如何在sql表(假设为表a)中删除重复行编码
方法1:url
stp1:筛选出不重复的表记录spa
select distinct a.* from a.net
stp2:将记录插入到临时表b中blog
insert into b
select distinct a.* from a
stp3:清空表a
truncate table a
stp4:将临时表数据插入表a
insert into a
select * from b
方法2:
delete from a
where (a.col_1,a.col_2) in
( select col_1,col_2
from a
group by col_1,col_2
having count(*) > 1)
and rowid not in (select min(rowid) a vitae group by col_1,col_2 having count(*)>1)
4、My Sql row_number...partition_by函数以及如何模拟它
SELECT collect_user_name, collect_time,rank
FROM
(
SELECT t.collect_user_name,t.collect_time,
CASE WHEN @partition_by =null or @partition_by!= t.collect_user_name THEN @rownum := 1
ELSE @rownum :=@rownum + 1
END AS rank
,@partition_by := t.collect_user_name AS partition_by
FROM (select @partition_by:=null, @rownum:=0)s, (
SELECT collect_user_name, collect_time FROM pl_collect_call_info cat
WHERE date(cat.collect_time) = curdate()
ORDER BY cat.collect_user_name,cat.collect_time
) t
#INNER JOIN (SELECT @rownum :=0) r ON 1=1
#INNER JOIN (SELECT @partition_by :='') p ON 1=1
#ORDER BY t.collect_user_name, t.collect_time
)tb ;
5、My SQL间隔进行日期和时间算术,以及示例
日期间比较:date(regist_time)>=curdate() - interval 2 day
日期间计算:datediff(a,b):返回a,b相隔天数; adddate(a,n):a加上n天;subdate(a,n):a减去n天;
返回当前时间:curtime(),current_time();
返回当前日期和时间:now(), current_timestamp(), localtime(), localtimestamp(), sysdate()
日期和时间格式
年月日:DATE_FORMAT(cld.calendar_date, '%Y%m%d')
时分秒:DATE_FORMAT(NOW(),'%H:%i:%s'), H :24小时格式;h:12小时格式。
年月日&时分秒:DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s')
时间差函数:
datediff函数,返回值是相差的天数,不能定位到小时、分钟和秒。
-- 相差2天(a-b)
select datediff('2018-03-22 09:00:00', '2018-03-20 07:00:00');
TIMEDIFF函数,按时间格式返回时间差,含时分秒。语法:timediff(a,b):返回两个时间相减获得的差值,(a-b)
SELECT timediff('2018-05-21 14:51:43','2018-05-19 12:54:43');
TIMESTAMPDIFF函数,有参数设置,能够具体精确到天(DAY)、小时(HOUR),分钟(MINUTE)和秒(SECOND),使用起来比datediff函数更加灵活。对于比较的两个时间,时间小的放在前面,时间大的放在后面。(b-a)
--相差1天
select TIMESTAMPDIFF(DAY, '2018-03-20 23:59:00', '2015-03-22 00:00:00');
--相差49小时
select TIMESTAMPDIFF(HOUR, '2018-03-20 09:00:00', '2018-03-22 10:00:00');
--相差2940分钟
select TIMESTAMPDIFF(MINUTE, '2018-03-20 09:00:00', '2018-03-22 10:00:00');
--相差176400秒
select TIMESTAMPDIFF(SECOND, '2018-03-20 09:00:00', '2018-03-22 10:00:00');
6、My SQL使用null,及处理null
注意:空值不占空间,null值占空间。定义为NOT NULL的字段只能插入空值,不能插入null值,而NULL字段能够插入空值,也能够插入null值。
能够发现 is not null 只会过滤为null值的列,而<>会同时过滤空值和null值,因此要根据实际状况选择过滤方式。另外,判断null值只能用 is null 或 is not null ,不能用 = 或 <>。
注意事项:
1:在进行count()统计某列的记录数的时候,若是采用的NULL值,会别系统自动忽略掉,可是空值是会进行统计到其中的。
2: 判断NULL 用IS NULL 或者 is not null,SQL 语句函数中可使用ifnull()函数来进行处理,判断空字符用 =”或者 <>”来进行处理 。
3: 对于MySQL特殊的注意事项,对于timestamp数据类型,若是往这个数据类型插入的列插入NULL值,则出现的值是当前系统时间。插入空值,则会出现 ‘0000-00-00 00:00:00’ 。
4:对于空值的判断究竟是使用is null 仍是 =”要根据实际业务来进行区分。
五、当使用ORDER BY时,首先呈现NULL值。若是你用DESC以降序排序,NULL值最后显示。当使用GROUP BY时,全部的NULL值被认为是相等的,故只显示一行。
相关函数:
COALESCE(exp1,value1,...)函数:返回第一个非null值,若是全部都为null,则返回null;
IFNULL(expression,value) 函数:若是表达式为null,则返回value,不然返回表达式的值;
7、使用MySQL会话变量实现窗口函数
函数形式:聚合函数() over (partition by ... order by ...) ,其中over() 为窗口 ;
窗口分类:可分为静态窗口、滑动窗口(聚合函数)。
按照功能划分,能够把MySQL支持的窗口函数分为以下几类:
详细可参考随笔:使用MySQL会话变量实现窗口函数
对于滑动窗口的范围指定,有两种方式,基于行和基于范围,具体区别以下:
一、基于行:
一般使用BETWEEN frame_start AND frame_end语法来表示行范围,frame_start和frame_end能够支持以下关键字,来肯定不一样的动态行记录:
CURRENT ROW 边界是当前行,通常和其余范围关键字一块儿使用
UNBOUNDED PRECEDING 边界是分区中的第一行
UNBOUNDED FOLLOWING 边界是分区中的最后一行
expr PRECEDING 边界是当前行减去expr的值
expr FOLLOWING 边界是当前行加上expr的值
好比,下面都是合法的范围:
rows BETWEEN 1 PRECEDING AND 1 FOLLOWING 窗口范围是当前行、前一行、后一行一共三行记录。
rows UNBOUNDED FOLLOWING 窗口范围是当前行到分区中的最后一行。
rows BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 窗口范围是当前分区中全部行,等同于不写。
二、基于范围:
和基于行相似,但有些范围不是直接能够用行数来表示的,好比但愿窗口范围是一周前的订单开始,截止到当前行,则没法使用rows来直接表示,此时就可使用范围来表示窗口:INTERVAL 7 DAY PRECEDING。Linux中常见的最近1分钟、5分钟负载是一个典型的应用场景。
有的函数无论有没有frame子句,它的窗口都是固定的,也就是前面介绍的静态窗口,这些函数包括以下:
8、时间与时间间隔的运算有哪些
参考第五条
9、concat(,) 与group concat()函数
concat()函数
一、功能:将多个字符串链接成一个字符串。
二、语法:concat(str1, str2,...)
返回结果为链接参数产生的字符串,若是有任何一个参数为null,则返回值为null。
group_concat()函数
功能:将group by产生的同一个分组中的值链接起来,返回一个字符串结果。该函数返回带有来自一个组的链接的非NULL值的字符串结果。
例如:
一、使用group concat()函数实现列转行
二、使用substring_index和cross join将列里面的的数字都拆分出来,把一行变成一列
substring_index(str,delim,count)
说明:substring_index(被截取字段,关键字,关键字出现的次数)
例:select substring_index("blog.jb51.net","。",2) as abstract from my_content_t
结果:blog.jb51
(注:若是关键字出现的次数是负数 如-2 则是从后倒数,到字符串结束)
select substring_index("blog.jb51.net",".",-2) as abstract
结果:jb51.net
表a cross join 表b,以b为准,返回表b每行对应的表a中的全部记录(表b每行都对应表a中的全部的记录)
例如:存在下表digits,表gurl
a cross join b,返回
行转列实例:
附代码以下:
select *,substring_index(gurl, ',', digit), SUBSTRING_INDEX(substring_index(gurl, ',', digit),',' ,- 1) gurl
FROM digits
cross join gurl
where digit BETWEEN 1 AND
(SELECT 1 + LENGTH(gurl) - LENGTH(REPLACE (gurl, ',', '')));
10、where、having的条件筛选类型有哪些,哪些包含null,哪些不包含
“Where” 是一个约束声明,是在查询结果集返回以前约束来自数据库的数据,且Where中不能使用聚合函数。
“Having”是一个过滤声明,是在查询结果集返回之后对查询结果进行的过滤操做,在Having中可使用聚合函数。
HAVING语句一般(亲自验证,不是必须!)与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集。
HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足。
11、length()与char_length
select length(remerk),char_length(remerk),mad.*
from `id-admin-db`.ad_operate_log mad
limit 10;
char_length(str)
一、单位为字符
二、无论汉字仍是数字或者是字母都算是一个字符
length(str)
一、字节,utf8编码下,一个汉字三个字节,一个数字或字母一个字节。
二、gbk下,一个汉字两个字节,一个数字或字母一个字节。
length()<>char_length()能够用来检验是否含有中文字符