忘记MySQL的root密码的解决方法
修改 my.cnf 文件 ,在 [mysqld] 下添加 skip-grant-tables 重启 mysql 就可以免密登录
mysql 毫秒值格式化日期
FROM_UNIXTIME(time_field,'%Y-%m-%d') 例如:格式化为 2020-10-25
mysql 格式化日期
date_format(sysdate(),'%Y-%m-%d') 例如:格式化当前时间 2020-10-25
week()函数
WEEK函数接受两个参数:date是要获取周数的日期。mode是一个可选参数,用于确定周数计算的逻辑。它允许您指定本周是从星期一还是星期日开始,返回的周数应在0到52之间或0到53之间。
WEEK(date, mode); 返回周数
week(时间)默认从0开始,并星期天默认为第一天,及国外的算法
week(时间,1)从1开始,并星期一为第一天,及国内算法
例如:
select WEEK('2020-11-09 11:15:55',1); 返回 46 为第四十六周,为国内算法
weekday()函数
WEEKDAY(date)
WEEKDAY函数接受1个参数,即DATE或DATETIME值,它返回一个整数,范围从0到6,表示星期一到星期日。如果日期为NULL,则无效或零(0000-00-00),WEEKDAY函数返回NULL
示例:SELECT DAYNAME('2020-11-09 11:15:55'), WEEKDAY('2020-11-09 11:15:55');
month()函数
select month('2020-11-09 11:15:55'); 返回当前月份
示例: 查询 2020 年每月的订单数
SELECT
MONTH(orderDate) month,
ROUND(
SUM(quantityOrdered * priceEach)
) subtotal
FROM orders
INNER JOIN orderdetails USING (orderNumber)
WHERE
YEAR(orderDate) = 2020
GROUP BY month;
NOW() 函数
2020-11-10 16:16:11 返回当前时间
YEAR() 函数
select YEAR('2020-11-09 11:15:55'); 返回当前年份
ROUND() 函数
在mysql中,round函数用于数据的四舍五入,它有两种形式:
1、round(x,d) ,x指要处理的数,d是指保留几位小数
这里有个值得注意的地方是,d可以是负数,这时是指定小数点左边的d位整数位为 0, 同时小数位均为0;
2、round(x) ,其实就是round(x,0),也就是默认d为0;
下面举几个示例
1、查询: select round(1123.267,2);
结果:1123.27
2、查询: select round(1123.26723,1);
结果: 1123.3
3、查询: select round(1123.26723,0);
结果:1123
4、查询: select round(1123.26723,-1);
结果: 1120 意思就是小数点左边第一位之后都是 0 (包括第一位)
5、查询: select round(1123.26723,-2);
结果:1100 意思就是小数点左边第二位之后都是 0 (包括第二位)
6、查询: select round(1123.26723);
结果:1123
DAY() 函数
DAY函数返回给定日期的月份的日期部分
语法:DAY(date);
例如: SELECT DAY('2020-11-09 11:15:55'); 返回 9
DAY函数接受一个参数,它是您要获取月份日期的日期值。如果date参数为零,例如'0000-00-00',则DAY函数返回0,如果日期为NULL,则DAY函数返回NULL值。
请注意,DAY 函数是 DAYOFMONTH 函数的同义词。
要根据指定的日期获取一个月中的天数,您可以组合LAST_DAY和DAY函数,如以下示例所示:
SELECT DAY(LAST_DAY('2020-11-09 11:15:55')); 返回 30 为当年月份的总天数
示例:返回 2020 年 11 月份每天的订单
SELECT
DAY(orderdate) dayofmonth,
COUNT(*)
FROM
orders
WHERE
YEAR(orderdate) = 2020
GROUP BY dayofmonth
ORDER BY dayofmonth;
LAST_DAY() 函数 返回月份中的最后一天
USING() 函数
using 等价于 join 操作中的 on,例如 a 和 b 根据 id 字段关联,那么以下等价
using(id) on a.id=b.id
select a.name,b.age from test as a join test2 as b on a.id=b.id
select a.name,b.age from test as a join test2 as b using(id)
ceiling() 函数
SELECT CEILING(5.2); 向上取整,得数是 6
floor() 函数
SELECT FLOOR(5.6) 向下取整,得数是 5
truncate() 函数
截断,意思是保留小数点后的几位
例如:select TRUNCATE(6.235,2); 返回 6.23 保留两位小数
ABS() 函数,返回绝对值
例如:select ABS(-8); 返回 8
字符串函数
SELECT LENGTH('sky') 字符串字符个数/长度(LENGTH)
SELECT UPPER('sky') 转大写
SELECT LOWER('Sky') 转小写用户输入时时常多打空格,下面三个函数用于处理/修剪(trim)字符串前后的空格,L、R 表示 LEFT、RIGHT:
SELECT LTRIM(' Sky');
SELECT RTRIM('Sky ');
SELECT TRIM(' Sky ');
切片:
-- 取左边,取右边,取中间
SELECT LEFT('zhangsan', 4); 取左边(LEFT)4个字符
SELECT RIGHT('zhangsan', 6); 取右边(RIGHT)6个字符
SELECT SUBSTRING('zhangsanlisiwangwu', 7, 6);
-- 取中间从第7个开始的长度为6的子串(SUBSTRING)
-- 注意是从第1个(而非第0个)开始计数的
-- 省略第3参数(子串长度)则一直截取到最后
-- 表示截取 zhangsan 字符串,从第三个位置开始,包括 3,下标从 1 开始
select substr('zhangsan',3)
-- 表示截取 zhangsan 字符串,从位置 3 开始,截取 2 位
select substring('zhangsan',3,2)
-- 查询 zhangsan 字符串中 a 字符的下标,下标从 1 开始
select instr('zhangsan','a');
-- 截取邮箱姓名
select substr("zhangsan@qq.com",1,(instr("zhangsan@qq.com",'@')-1)) 用户名;
定位:
SELECT LOCATE('lisi', 'zhangsanlisiwangwu');
-- 定位(LOCATE)首次出现的位置
-- 没有的话返回0(其他编程语言大多返回-1,可能因为索引是从0开始的)
-- 这个定位/查找函数依然是不区分大小写的
替换:
SELECT REPLACE('zhangsanlisi', 'lisi', 'wangwu'); 将字符串中的 lisi 换为 wangwu
连接:
select CONCAT('aaa','bbb','ccc'); 字符串连接
MySQL中的日期函数
SELECT NOW(); -- 2020-11-10 19:32:51
SELECT CURRENT_TIMESTAMP(); -- 2020-11-10 19:32:51
SELECT CURDATE(); -- 2020-11-10
SELECT CURTIME(); -- 19:33:46
提取时间日期对象中的元素:
select YEAR(now()); 返回年份 2020
select month(now()); 返回月份 11
select day(now()); 返回日期 10
select hour(now()); 返回小时
select minute(now()); 返回分钟
select second(now()); 返回秒
select DATE('2008-12-29 16:25:46') 返回日期部分 2008-12-29
select time('2008-12-29 16:25:46') 返回时间部分 16:25:46
以上函数均返回整数,还有另外两个返回字符串的:
SELECT DAYNAME(NOW()); 返回当前天字符 例如:Tuesday
SELECT MONTHNAME(NOW()); 返回月份字符串 例如:November
标准SQL语句有一个类似的函数 EXTRACT(),若需要在不同DBMS中录入代码,最好用EXTRACT():
SELECT EXTRACT(YEAR FROM NOW()); 例如:提取当前时间的年份
当然第一参数也可以是MONTH, DAY, HOUR ……
STR_TO_DATE() 函数
将一个任意格式的字符串日期转换为 datetime 类型
语法 str_to_date(str,format)
例如:
select STR_TO_DATE('20150230180633','%Y%m%d%H%i%s')
转换后就是 2015-02-30 18:06:33
select STR_TO_DATE('20150230','%Y%m%d')
转换后就是 2015-02-30
格式化日期和时间
DATE_FORMAT(date, format) 将 date 根据 format 字符串进行格式化。
TIME_FORMAT(time, format) 类似于 DATE_FORMAT 函数,但这里 format 字符串只能包含用于小时,分钟,秒和微秒的格式说明符。其他说明符产生一个 NULL 值或0
例如:
SELECT DATE_FORMAT(NOW(), '%M %d, %Y'); November 10, 2020-- 格式说明符里,大小写是不同的,这是目前SQL里第一次出现大小写不同的情况
SELECT TIME_FORMAT(NOW(), '%H:%i %p'); 11:07 AM
计算日期和时间
有时需要对日期事件对象进行运算,如增加一天或算两个时间的差值之类,介绍一些最有用的日期时间计算函数:
DATE_ADD,
DATE_SUB
DATEDIFF
TIME_TO_SEC
增加或减少一定的天数、月数、年数、小时数等等
SELECT DATE_ADD('2018-02-03', INTERVAL -1 DAY); 当天天数 -1 反回 2018-02-02
SELECT DATE_SUB('2018-02-03', INTERVAL 2 YEAR); 当前年数 -2 返回 2016-02-03
但其实不用函数,直接加减更简洁: 同上
select NOW() - INTERVAL 1 DAY;
select NOW() - INTERVAL 1 YEAR;
计算日期差异
SELECT DATEDIFF('2019-01-01 09:00', '2019-01-05'); 返回 -4 会忽略时间部分,只算日期差异
借助 TIME_TO_SEC 函数计算时间差异
TIME_TO_SEC:计算从 00:00 到某时间经历的秒数
SELECT TIME_TO_SEC('09:00'); 返回 32400
SELECT TIME_TO_SEC('09:00') - TIME_TO_SEC('09:02'); 结果 -120
IFNULL和COALESCE函数
两个用来替换空值的函数:IFNULL, COALESCE. 后者更灵活
IFNULL 示例:查询 age 如果为 null 返回一个 xxx
select ifnull(age,'xxx') from userinfo;
COALESCE 示例:将 age 替换为 name 如果 name 也是 null 则替换为 “name也是 null”
select id,name,coalesce(age,name,'name也是 null') as alias from userinfo;
IF函数
IF(条件表达式, 返回值1, 返回值2) 返回值可以是任何东西,数值 文本 日期时间 空值null 均可
例如:年龄大于等于 18 返回成年,小于 18 返回未成年
select id,name,if(age >= 18,'成年','未成年') from userinfo;
CASE运算符
当分类多余两种时,可以用IF嵌套,也可以用CASE语句,后者可读性更好
CASE语句结构:
CASE
WHEN …… THEN ……
WHEN …… THEN ……
WHEN …… THEN ……
……
[ELSE ……] (ELSE子句是可选的)
END
例如:select
id,
name,
age,
case
when age >= 18 then '成年'
when age < 18 and age > 10 then '未成年'
when age < 6 and age > 3 then '幼童'
else '不做统计'
end as kind
from userinfo
UNION 和 UNION ALL 函数
语法:
select column,......from table1
union [all]
select column,...... from table2
union 与 union all 的区别当使用union 时,mysql 会把结果集中重复的记录删掉,而使用union all ,mysql 会把所有的记录返回,且效率高于union
使用 UNION 查询
例如这里有两张表 userinfo ,userinfo2
这里面有一条重复数据 zhangsan 20
使用 UNION 查询
select id,name,age from userinfo
union
select id,name,age from userinfo2
UNION 查询结果说明
重复记录是指查询中各个字段完全重复的记录,如上例,若 name一样但 id 号不一样算作不同记录。
第一个 SELECT 语句中被使用的字段名称也被用于结果的字段名称,如上例的 id,name,age。
各 SELECT 语句字段名称可以不同,但字段属性必须一致。
使用 UNION ALL 查询
select id,name,age from userinfo
union all
select id,name,age from userinfo2
使用 UNION ALL 的时候,只是单纯的把各个查询组合到一起而不会去判断数据是否重复。因此,当确定查询结果中不会有重复数据或者不需要去掉重复数据的时候,应当使用 UNION ALL 以提高查询效率。
UNION 子句中使用 ORDER BY
子句中使用 ORDER BY,即将 SELECT 子句的结果先排序,然后再把这些子句查询的结果进行集合。
在子句中使用 ORDER BY,由于优先级问题,需要将整个子句加圆括号(),且必须与 LIMIT 结合使用:
(select id,name,age from userinfo ORDER BY id DESC LIMIT 10)
union all
(select id,name,age from userinfo2 ORDER BY id DESC LIMIT 10)
UNION 整句中使用 ORDER BY
如果想使用 ORDER BY 或 LIMIT 来对全部 UNION 结果进行分类或限制,则应对单个 SELECT 语句加圆括号,并把 ORDER BY 或 LIMIT 放到最后一个的后面
(select id,name,age from userinfo)
union all
(select id,name,age from userinfo2)
ORDER BY id DESC
UNION ORDER BY 应用于别名
如果 SELECT 中使用到了字段别名,则 OEDER BY 必须引用别名:
(select id as idd,name,age from userinfo)
union all
(select id,name,age from userinfo2)
ORDER BY idd DESC
with ... as 用法 mysql 8 新特性
示例:类似生成一张临时表
with a as(
select id,tenant_id from uin_callcenter_agents
)
select id from a
相当于
SELECT id, name, ageFROM ( SELECT id, NAME, age FROM userinfo ) a where a.id = 1
find_in_set() 函数的使用
FIND_IN_SET(str,strlist)
str 要查找的字符串 strlist 要查找的数据,已 , 逗号隔开
例如:
select fint_in_set('a','a,b,c,d');
会返回一个 1 ,因为 a 在第一位,如果在第二位则返回 2
SELECT FIND_IN_SET('a', 'abcd');
这样是无法匹配的因为是精准匹配,多个要以逗号隔开才可以匹配,会返回一个 0
例如:数据库有这两条数据 first_name 一个是 Steven,a 一个是 Steven 使用 find_in_set() 函数都可以匹配到
select * from employees where find_in_set('Steven',first_name);
https://www.cnblogs.com/xiaoxi/p/5889486.html
https://www.cnblogs.com/duanrantao/p/9358409.html
GROUP_CONCAT 函数
字面意思,分组后再拼接
将查询的某个字段有多列多值的时候使用指定字符连接
例如:t 表中 id 为 1 的有 3 个,id 为 2 的有两个,如果我们根据 id 分组后,只会显示第一个 name 的值
例如:
select id,name from t GROUP BY id
结果只会显示分组后的第一个值
如果我们分组后想显示所有的值就可以使用,group_concat 函数
例如
select id,group_concat(name) from t group by id;
结果:
默认是使用 , 逗号拼接
如果想使用别的符号拼接
例如:使用 - 拼接
select id,group_concat(name separator '-') from t group by id;
结果:
CONCAT_WS() 函数
使用函数CONCAT_WS()。使用语法为:CONCAT_WS(separator,str1,str2,…)
CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。但是CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
如:select CONCAT_WS('_',id,phone,grade_id) from user
返回结果为
DATE_SUB() 函数
定义和用法
DATE_SUB() 函数从日期减去指定的时间间隔
语法
DATE_SUB(date,INTERVAL expr type)
date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔
比如:
获取当前时间的前一天时间
select DATE_SUB(SYSDATE(), INTERVAL -1 DAY)
获取当前时间的后一天时间
select DATE_SUB(SYSDATE, INTERVAL 1 DAY)
原文 https://zhuanlan.zhihu.com/p/237808092