mysql 常用操作

忘记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("[email protected]",1,(instr("[email protected]",'@')-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 

mysql 常用操作_第1张图片
查询前


查询后

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

mysql 常用操作_第2张图片
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);

mysql 常用操作_第3张图片

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 的值

mysql 常用操作_第4张图片

例如:
select id,name from t GROUP BY id
结果只会显示分组后的第一个值

mysql 常用操作_第5张图片

如果我们分组后想显示所有的值就可以使用,group_concat 函数
例如
select id,group_concat(name) from t group by id;
结果:

mysql 常用操作_第6张图片

默认是使用 , 逗号拼接
如果想使用别的符号拼接
例如:使用 - 拼接
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

你可能感兴趣的:(mysql 常用操作)