目录
一、中文汉字按照拼音首字母排序
二、case when then else end语法的使用
三、取两表并集
四、MySql8导入数据时insert插入数据慢
五、查看bin-log日志
六、MySql常用运算符和函数
七、SQL语句执行分析
八、定时任务
九、四舍五入
十、CONVERT(字段名, 类型) 字符串转换用法
十一、保存表情符号
十二、清除mysql命令行输入历史
十三、mysql忘记root密码
十四、查看连接数进程数
十五、计算地理位置距离ST_DISTANCE_SPHERE(5.7)和ST_DISTANCE(5.6)
十六、一次查询多个COUNT
十七、查询数据字典
一、中文汉字按照拼音首字母排序
1、排序字段的字符编码是utf8_general_ci
SELECT * FROM table t1 ORDER BY CONVERT(t1.`name` USING gbk) COLLATE gbk_chinese_ci ASC
2、排序字段的字符编码是 latin1_swedish_ci
ORDER BY birary(t1.`name`) ASC
3、排序字段的字符编码是 GBK
ORDER BY t1.`name` ASC
二、case when then else end语法的使用
1:两种语法
case sex when '1' then '男' when '2' then '女' else '其他' end
case when sex='1' then '男' when sex='2' then '女' else '其他' end
2:用法
SELECT COUNT(*),sum(case when t1.state = '1' then 1 else 0 end),t1.sex
FROM
(SELECT 1 AS id , '张三' AS name, '1' AS sex, '1' AS state
UNION ALL
SELECT 2 AS id , '李四' AS name, '2' AS sex, '1' AS state
UNION ALL
SELECT 3 AS id , '王五' AS name, '1' AS sex, '2' AS state) AS t1
GROUP BY t1.sex
三、取两表并集
1:思路
先两表左连接然后两表右连接,把这两部分的数据合起来去重
2:用法
SELECT DISTINCT t.* FROM (
SELECT * FROM
(SELECT 1 AS id , 'b1' AS name
UNION ALL
SELECT 2 AS id , 'b2' AS name
UNION ALL
SELECT 3 AS id , 'b3' AS name) AS t1
LEFT JOIN
(SELECT 1 AS id1 , 'c1' AS con
UNION ALL
SELECT 4 AS id1 , 'c4' AS con) AS t2
ON t1.id = t2.id1
UNION ALL
SELECT * FROM
(SELECT 1 AS id , 'b1' AS name
UNION ALL
SELECT 2 AS id , 'b2' AS name
UNION ALL
SELECT 3 AS id , 'b3' AS name) AS t1
RIGHT JOIN
(SELECT 1 AS id1 , 'c1' AS con
UNION ALL
SELECT 4 AS id , 'c4' AS con) AS t2
ON t1.id = t2.id1) as t
四、MySql8导入数据时insert插入数据慢
1:同样的语句在MySql5中导入速度还可以,但在MySql8中变得非常慢。原因是MySql8默认开启了一些设置。
2:修改mysql配置文件(ProgramData\MySQL\MySQL Server 8.0\my.ini)
[mysqld]
skip-log-bin
# disable_log_bin Linux下使用这个
五、查看bin-log日志
1:查看有哪些日志文件
SHOW BINARY LOGS;
SHOW MASTER LOGS;
2:查看日志文件内容
SHOW BINLOG EVENTS IN 'DESKTOP-FJ970FJ-bin.000043';(SHOW BINLOG显示第一个binlog的内容)
3:查看当前正在写入的binlog日志文件
SHOW MASTER STATUS;
4:查看是否开启了binlog日志
SHOW VARIABLES LIKE 'log_bin';(SELECT @@log_bin)
5:查看binlog的日志和名称
SHOW VARIABLES LIKE '%log_bin%';
6:开始一个新的日志文件
FLUSH LOGS;(重启mysql也可以达到相同的效果)
六、MySql常用运算符和函数
1:等于(=不可以判断null)(<=>可以判断null)
2:判断null(a is null,a is not null),(isnull(a),!isnull(a))
3:区间(between min and max)(not between min and max)是一个闭区间
4:运算符(<),(>),(<=),(>=)
5:随机数 RAND();
6:least(val1,val2,...)返回最小值
7:greastest(val1,val2,...)返回最大值
8:round(M,D);返回M的四舍五入的值, D表示要保留几们小数,默认值是0
9:abs();绝对值
10:avg();平均值
11:count();数量 会忽略null值
12:sum();求和
13:min();最小
14:max();最大
15:日期时间now(6),sysdate(6),current_timestamp(6)
16:curdate(),curtime()
17:日期加 date_add(NOW(), interval '1 12:10' day_minute),select date_add(NOW(), interval '1-1' YEAR_MONTH),select date_add(NOW(), interval '1' SECOND)
18:日期减 date_sub() 加1天-DATE_SUB(CURDATE(),INTERVAL -1 DAY);减1天-DATE_SUB(CURDATE(),INTERVAL 1 DAY);加1周-DATE_SUB(CURDATE(),INTERVAL -1 WEEK);
19:日期差 datediff(NOW(),NOW());单位天
20:计算日期中的星期 dayname(NOW());
21:日期格式化 SELECT str_to_date('2017-02-01', '%Y-%m-%d %H:%i:%s');
22:left(str, len) 返回字符串str的左端len个字符
23:length() 返回长度
24:lower(str) 返回小写的字符串str
25:substring() 取子字符串, 第二个参数是截取的起始位置, 第三个参数是要截取的长度
26:concat(val1,val2) 字符串拼接
27:replace(name,'a','b')
28:TIMESTAMPDIFF(类型FRAC_SECOND/SECOND/MINUTE/HOUR/DAY/WEEK/MONTH/QUARTER/YEAR,开始时间,结束时间)返回日期差
七、SQL语句执行分析
检查功能是否开启:执行show profiles;如果没有记录表明没有开启通过 set profiling=1;开启
执行“explain sql语句”可以得到sql语句执行的详细信息
show WARNINGS;可以查看优化语句
八、定时任务
开始前需要开启事件调度器
SHOW VARIABLES LIKE '%event_sche%';
SET global event_scheduler=on;//开启
SET global event_scheduler=off;//关闭
1:创建定时任务
-- 创建定时计划的例子,每天定时,自动将日期加1天
CREATE EVENT `test_update`
ON SCHEDULE EVERY 1 DAY STARTS '2020-01-01 01:00:00'
ON COMPLETION PRESERVE
ENABLE
DO
update test_update set start_date=CURRENT_DATE, end_date = date(CURRENT_DATE + 1);
通过navicat创建:事件->新建事件->定义
![](https://img-blog.csdnimg.cn/20210519134706200.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FpbmptODg4OA==,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210519140104675.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FpbmptODg4OA==,size_16,color_FFFFFF,t_70)
定义:可以调用存储过程,也可以直接执行语句-update test_update set start_date=CURRENT_DATE, end_date = date(CURRENT_DATE + 1)。
状态:DISABLE不激活,ENABLE激活。
ON COMPLETION:PRESERVE 当event到期了,event会被disable,但是该event还是会存在,NOY PRESERVE 当event到期的时候,该event会被自动删除掉。
AT:时间戳,用来完成单次的计划任务。
EVERY:在定期间隔重复执行。
STARTS:开始生效时间 INTERVAL 可以设置间隔重复执行(+INTERVAL 与 EVERY 不能同时使用)。
ENDS:结束时间可设置一个 INTERVAL 控制未来结束。
2:定时任务调用存储过程
创建存储过程
CREATE DEFINER=`root`@`localhost` PROCEDURE `erp_sure_jihua`()
BEGIN
DECLARE now_date varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
DECLARE now_day INT;
DECLARE jihua_sure_day INT;
DECLARE jihua_sure_yue INT;
DECLARE sure_yue varchar(7) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
SET now_date = DATE_FORMAT(NOW(), '%Y-%m-%d');
SET now_day = DAY(now_date);
SELECT value into jihua_sure_day from s_config WHERE only_tag ='home_erp_tibao_jihua_sure_day';
SELECT value into jihua_sure_yue from s_config WHERE only_tag ='home_erp_tibao_jihua_sure_yue';
IF now_day = jihua_sure_day THEN
IF jihua_sure_yue = '1' THEN
SET sure_yue = DATE_FORMAT(DATE_SUB(now_date, interval 1 MONTH), '%Y-%m');
ELSE
SET sure_yue = DATE_FORMAT(now_date, '%Y-%m');
END IF;
UPDATE s_user_jh SET is_sure = 1, sure_time = unix_timestamp(now()) WHERE jh_date = sure_yue;
END IF;
END
任务中定义修改为 CALL erp_sure_jihua()
九、四舍五入
FLOOR(X)
:返回不大于X
的最大整数值
CEILING(X)
:返回不小于X
的最小整数值
ROUND(X)
:返回参数X
的四舍五入的一个整数
ROUND(X,D)
:返回参数X
的四舍五入的有D
为小数的一个数字。如果D
为0
,结果将没有小数点或小数部分
十、CONVERT(字段名, 类型) 字符串转换用法
SELECT CONVERT("09", UNSIGNED);
DATE-日期、DATETIME-日期时间、TIME-时间、CHAR-字符串、SIGNED-有符号整型、UNSIGNED-正数、BINARY-二进制格式
十一、保存表情符号
mysql8保存表情时报错,这时需要设置字段的字符集为utf8mb4排序为utf8mb4_general_ci,应为数据库保存时最终以字段字符为准,字段没设置时用表的字符设置,表没设置用数据库的字符设置,所以这里直接设置字段的字符集就可以。
十二、清除mysql命令行输入历史
rm ~/.mysql_history
十三、mysql忘记root密码
修改配置文件my.cnf->
增加 skip-grant-tables 忽略权限->
重启mysql服务(docker直接重启docker)->
docker exec -it mysql8 /bin/bash(进入容器)->
mysql -u root -p(此时免密)->
flush privileges(防止出现The MySQL server is running with the --skip-grant-tables option so it cannot execute错误)->
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '12345';(也可以先创建新用户create user 'sroot'@'%' identified by 'password';->flush privileges->grant all privileges on *.* to 'sroot'@'%' with grant option;)->
flush privileges;->
ALTER USER 'sroot'@'%' IDENTIFIED WITH mysql_native_password BY '12345';->
flush privileges;->
exit;->
修改my.cnf去掉开始增加的内容->
重启mysql服务(docker直接重启容器)
十四、查看连接数进程数
查询数据库当前进程的连接数:select count(*) from v$process;
查看数据库当前会话的连接数:select count(*) from v$session;
查看数据库的并发连接数:select count(*) from v$session where status='ACTIVE';
查看当前数据库建立的会话情况:select sid,serial#,username,program,machine,status from v$session;
查询数据库允许的最大连接数:select value from v$parameter where name = 'processes';或者:show parameter processes;
十五、计算地理位置距离ST_DISTANCE_SPHERE(5.7)和ST_DISTANCE(5.6)
ST_DISTANCE_SPHERE(POINT(a.longitude, a.latitude),POINT(#{longitude}, #{latitude})) / 1000 单位km
ST_DISTANCE(POINT(a.longitude, a.latitude),POINT(#{longitude}, #{latitude})) *111195/ 1000 单位km ST_DISTANCE(单位度)*6371000*PI/180(地球半径)->米
十六、一次查询多个COUNT
select
count(case when sex ='男' then 1 end) as man,
count(case when sex ='女' then 1 end) as woman,
count(case when age>=18 then 1 end) as adult,
count(case when age<18 then 1 end) as nonage
from user
十七、查询数据字典
SELECT
C.COLUMN_NAME AS '字段名', C.COLUMN_TYPE AS '数据类型',C.IS_NULLABLE AS '允许为空', C.EXTRA AS 'PK', C.COLUMN_COMMENT AS '字段说明'
FROM COLUMNS C
INNER JOIN TABLES T ON C.TABLE_SCHEMA = T.TABLE_SCHEMA
AND C.TABLE_NAME = T.TABLE_NAME
WHERE
T.TABLE_SCHEMA = 'dbname' AND T.TABLE_NAME = 'table'