mysql常用方法
一、基本用法
-- MySQL创建唯一索引
CREATE UNIQUE INDEX 索引名 ON 表名(列名1,列名2,...);
--也可以使用ALTER TABLE语句给现有表添加唯一索引(UNIQUE)
ALTER TABLE 表名 ADD CONSTRAINT 索引名 UNIQUE KEY(列名1,列名2,...);
alter table car_data add constraint car_data_evtId_uindex unique (evtId)
-- 删除索引
ALTER TABLE plan_project DROP KEY plan_project_field_project_number_UN;
-- 时间戳互转
SELECT FROM_UNIXTIME(1617184000); -- 假设1617184000是你的Unix时间戳
SELECT UNIX_TIMESTAMP('2021-03-31 00:00:00');
-- 添加列
alter table people_data Add photoBase64 longtext AFTER photo;
-- 把applyTime的值置为null
update people_data set applyTime = null;-- 创建数据库
create database db_example;
CREATE DATABASE `test-test`;
-- 创建用户
create user 'springuser'@'localhost' identified by '123456'
grant all on db_example.* to 'springuser'@'localhost' -- 查看一个数据中所有表的相关信息
show table status \G
show table status like 'face_data' \G;
-- 根据表2字段值跟新表1字段值
update device_channel T1 ,test T2
set T1.longitude = T2.longitude , T1.latitude = T2.latitude, T1.longitudeGcj02 = T2.longitude , T1.latitudeGcj02 = T2.latitude, T1.longitudeWgs84 = T2.longitude , T1.latitudeWgs84 = T2.latitude
where T1.deviceId = T2.deviceId
-- update select用法
update device_data T3
left join
(select T1.id,T1.name,T2.latitude,T2.longitude from device_data T1 LEFT JOIN device_channel T2 on T1.name = T2.name)T
on T3.id = T.id
set T3.lat = T.latitude,T3.lng = T.longitude
-- mysql姓名、身份证号、手机号脱敏
SELECT T1.id,
if(LENGTH(T1.name)>6,CONCAT(LEFT(T1.name,1), '*',RIGHT(T1.name,1) ),CONCAT(LEFT(T1.name,1), '*' )) AS name,
CONCAT(LEFT(T1.phone,4), '***' ,RIGHT(T1.phone,4)) AS phone,CONCAT(LEFT(T1.idCard,6), '********' ,RIGHT(T1.idCard,4))
FROM people_data T1 limit 100;
-- mysql导出数据
mysqldump -u 用户名 -p 数据库名 表名 > 导出文件名
mysqldump -u root -p test facedata > facedata.sql
mysqldump -u root -p --no-data test2 facedata > facedata.sql-- mysql解决死锁
SELECT trx_mysql_thread_id , trx_query FROM INFORMATION_SCHEMA.INNODB_TRX;
SHOW PROCESSLIST;
kill trx_mysql_thread_id
-- coalesce函数用法
coalesce(expression_1, expression_2, ...,expression_n)
依次参考各参数表达式,遇到非null值即停止并返回该值。如果所有的表达式都是空值,最终将返回一个空值。
把photo中的http://192.168.1.123:8080替换为https://afxq.com
REPLACE(photo,'http://192.168.1.123:8080','https://afxq.com')
UPDATE papply_data set photo = REPLACE(photo,'http://192.168.1.123:8080','https://afxq.com') where communityId = '57558d7c1eee46399e216946d655afae' and photo like 'http://192.168.1.123:8080%' -- mysql导出数据字典
-- 单个表导出
SELECTcolumn_name AS '字段名',column_type AS '字段类型',( CASE WHEN is_nullable = 'YES' THEN '是' ELSE '否' END ) AS '是否可空',( CASE WHEN column_key = 'PRI' THEN '是' ELSE '否' END ) AS '是否主键',column_comment AS '注释'
FROMinformation_schema.COLUMNS
WHEREtable_schema = 'test2' AND table_name = 'frp_port';-- 整个库导出
SELECTtable_name AS '表名',column_name AS '字段名',column_type AS '字段类型',( CASE WHEN is_nullable = 'YES' THEN '是' ELSE '否' END ) AS '是否可空',( CASE WHEN column_key = 'PRI' THEN '是' ELSE '否' END ) AS '是否主键',column_comment AS '注释'
FROMinformation_schema.COLUMNS
WHEREtable_schema = 'sl-cloud'-- limit用法
LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
初始记录行的偏移量是 0(而不是 1)
-- 取第一条
SELECT communityId FROM (select communityId,count(*) AS num from face_data fd where flag = 0 group by communityId )T order by num desc limit 0,1
-- 取第二条到第十条
SELECT communityId FROM (select communityId,count(*) AS num from face_data fd where flag = 0 group by communityId )T order by num desc limit 1,9 -- 查看当前时区
在MySQL客户端,可以通过如下命令查看当前时区:
SELECT @@global.time_zone;
查看当前时区的设置,可以通过如下命令:
SHOW VARIABLES LIKE '%time_zone%'; -- 获取字符串中逗号的个数
SELECT '0,100,101,183',LENGTH('0,100,101,183')-LENGTH(REPLACE('0,100,101,183',',',''))
-- 获取字符串中指定位置的值
SELECT REGEXP_SUBSTR('0,100,101,183', '[^,]+', 1, 3); -- mysql8 分组排序
SELECT * FROM (SELECT *, ROW_NUMBER()OVER(PARTITION BY name ORDER BY create_time DESC) AS rowNumber FROM monitor_info
)t
WHERE rowNumber = 1 -- 根据收入和支出统计销售额
SELECT T1.center_id,ifnull(sum(case when T1.status != 3 then amount END),0) AS total, -- 总营业额ifnull(sum(case when T1.status = 3 then amount END),0) AS refund, -- 退款ifnull(sum(case when T1.status = 3 then -amount else amount END),0) AS netRevenue, -- 净营业额count(distinct order_id) AS orderNum -- 订单数
FROM `log` T1
LEFT JOIN center T2
ON T1.center_id = T2.id
GROUP BY T1.center_id
ORDER BY T1.update_time DESC
二、常见问题
1、Mysql删除数据后磁盘空间未释放的解决办法
使用delete删除的时候,mysql并没有把数据文件删除,而是将数据文件的标识位删除,没有整理文件,因此不会彻底释放空间
官方推荐使用 OPTIMIZE TABLE命令来优化表,该命令会重新利用未使用的空间,并整理数据文件的碎片。
(1)、drop table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM ;
(2)、truncate table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM 。
truncate table其实有点类似于drop table 然后create,只不过这个create table 的过程做了优化,比如表结构文件之前已经有了等等。所以速度上应该是接近drop table的速度;
(3)、delete from table_name删除表的全部数据,对于MyISAM会立刻释放磁盘空间(应该是做了特别处理,也比较合理),InnoDB 不会释放磁盘空间;
(4)、对于delete from table_name where xxx带条件的删除, 不管是innodb还是MyISAM都不会释放磁盘空间;
(5)、delete操作以后使用optimize table table_name 会立刻释放磁盘空间。不管是innodb还是myisam 。所以要想达到释放磁盘空间的目的,delete以后执行optimize table 操作。
对于myisam可以直接使用 optimize table table_name, 当是InnoDB引擎时,会报“Table does not support optimize, doing recreate + analyze instead”,
一般情况下,由myisam转成innodb,会用alter table table.name engine='innodb’进行转换,优化也可以用这个。
所以当是InnoDB引擎时我们就用alter table table.name engine='innodb’来代替optimize做优化就可以
(6)、delete from表以后虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以使用这部分空间。
通过alter table A engine=innodb来重建表,实现数据库空间回收
参考博客:https://blog.51cto.com/u_710020/5680099
2、Unsupported character encoding ‘utf8mb4’
更改 JDBC 连接字符串
原连接字符串:
jdbc:mysql://localhost:3306/db_xxxxx?useSSL=false&characterEncoding=utf8mb4
修改后的连接字符串:
jdbc:mysql://localhost:3306/db_xxxxx?useSSL=false&character_set_server=utf8mb4
参考博客:https://blog.csdn.net/mingjunlintian/article/details/134818941
3、mysql中字符串截取与拆分
参考博客:https://blog.csdn.net/liqinglonguo/article/details/134673961
4、MySQL 连接数过多的处理方法 Too many connections
查看最大连接数
SHOW VARIABLES LIKE ‘max_connections’;
临时调整当前 MySQL 连接数
set GLOBAL max_connections = 300;
5、MySQL中的not in和null
当我们在MySQL中使用not in时,例如
select id
from user
when id not in(…)
如果not in(…)数据中有null时,返回的结果是空表
错误在于判断 a not in B的方法的本质是a 使用 != 与B中的每一条进行判断
在MySQL中, null代表的就是缺失未知值而不是空值, null与任何值用<>=等运算符判断时候返回的都是null
所以在使用not in 时需要注意数据中是否有null,并且null的判断使用的是is null, 或者is not null, 使用=是不行的
参考博客:https://blog.csdn.net/qq_52059326/article/details/130906129