一、数据库安装

1. 免安装数据库

进入MySQL文件下的bin目录 mysql bin目录_进入MySQL文件下的bin目录

2.修改root或其他用户密码
以windows为例: 
1. 关闭正在运行的MySQL服务。 
2. 打开DOS窗口,转到mysql\bin目录。 
3. 输入mysqld --skip-grant-tables 回车。--skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证。 
4. 再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysql\bin目录。 
5. 输入mysql回车,如果成功,将出现MySQL提示符:  mysql >。 
6. 连接权限数据库: use mysql; 。 
6. 改密码:update user set password=password("123") where user="root";(别忘了最后加分号) 。 
7. 刷新权限(必须步骤):flush privileges; 。 
8. 退出 quit。 
9. 注销系统,再进入,使用用户名root和刚才设置的新密码123登录(或者 在任务管理器中找到mysql进程关闭后重新启动该服务即可)。

修改数据库用户密码借鉴:mysql如何修改root用户的密码

3. 查看mysql版本(百度有其他方法)

select version() from dual;

二、简易技巧

1. 获取数据库表名、表字段信息

use information_schema; -- 语句分开执行
select 
	a.COLUMN_NAME,    -- 字段名
	a.TABLE_NAME,     -- 表名       
	a.COLUMN_COMMENT  -- 字段备注
from INFORMATION_SCHEMA.Columns a
where 
table_schema='数据库名'

2.获取数据库中所有表名及数据量

use information_schema; -- 语句分开执行
select table_name,table_rows from tables 
where TABLE_SCHEMA = '数据库的名称' order by table_rows desc;

3.数据库操作导致表锁死处理方法

使用权限用户查询数据库进程:

SELECT * FROM information_schema.innodb_trx ;

# 找到阻塞的进程后,杀死进程: 

kill 5040

进入MySQL文件下的bin目录 mysql bin目录_mysql_02

4.修改已有大量数据(百万级)表字段

创建新表,进行数据迁移,修改表名称,保留原始数据

5.获取当前数据库连接数及对应的ip地址

select SUBSTRING_INDEX(host,':',1) as ip , count(*) from information_schema.processlist group by ip;

6. many connection errors 解决办法

错误:

  Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

原因:

  同一个ip在短时间内产生太多(超过mysql数据库max_connection_errors的最大值)中断的数据库连接而导致的阻塞;

进入MySQL文件下的bin目录 mysql bin目录_进入MySQL文件下的bin目录_03

7. 循环新增数据

delimiter //                            #定义标识符为双斜杠
drop procedure if exists test;          #如果存在test存储过程则删除
create procedure test()                 #创建无参存储过程,名称为test
begin
    declare i int;                      #申明变量
    set i = 0;                          #变量赋值
    while i < 10 do                     #结束循环的条件: 当i大于10时跳出while循环
        INSERT INTO `test` (`ID`) VALUES ('0');    #往test表添加数据
        set i = i + 1;                  #循环一次,i加一
    end while;                          #结束while循环
end
//                                 #结束定义语句
call test();                            #调用存储过程

8. 拼接sql

set @pcsConfigId = '1523956314869334094';
-- 查询接口 的所有设备和接口字段
SELECT
	dev.device_name,
	dev.device_code,
	dev.id as device_id,
	par.param_code,
	par.id as param_id,
	par.param_name,
	par.param_suffix,
	par.param_prefix,
	CONCAT("INSERT INTO pcs_device_param(`fk_pcs_id`, `fk_pcs_param_id`, `fk_pcs_device_id`, `measure_code`, `del_flag`) VALUES (",@pcsConfigId,", ",par.id,", ",dev.id,", '",CONCAT(par.param_prefix,SUBSTR(dev.device_code,4),par.param_suffix),"', 0);") as insertSql
FROM
	pcs_device_info dev
	LEFT JOIN pcs_param_info par ON 1 = 1 
WHERE
	dev.fk_pcs_id = @pcsConfigId 
	AND par.fk_pcs_id = @pcsConfigId
	
	-- 去除已经保存过的点位信息
	AND CONCAT(dev.id,'____',par.id) NOT IN (select CONCAT(fk_pcs_device_id,'____',fk_pcs_param_id) as unKey FROM pcs_device_param WHERE fk_pcs_id = @pcsConfigId )
	;

-- CONCAT("select '", deviceLists,"' as aaaaa from t_performance limit 1");
-- INSERT INTO pcs_device_param(`fk_pcs_id`, `fk_pcs_param_id`, `fk_pcs_device_id`, `measure_code`, `del_flag`) VALUES (1523956314869334094, 6, 1552839199189631009, 'AIRTU010009', 0);



-- SELECT device_code from pcs_device_info where fk_pcs_id = @pcsConfigId;
-- SELECT param_code from pcs_param_info where fk_pcs_id = @pcsConfigId;
-- 需要新增的sql数量   本类型设备数量 * 接口参数数量
select 92*21 - count(1)  from pcs_device_param WHERE fk_pcs_id = @pcsConfigId ;

9. 存储过程 游标循环

-- 建立存储过程之前需要判断该存储过程是否存在,若存在则删除
DROP PROCEDURE IF EXISTS savePcsPoint;
-- 创建存储过程
CREATE PROCEDURE savePcsPoint(in pcsConfigId varchar(30), out changeCount int )
-- 标识存储过程开始
BEGIN
	-- 定义变量
	DECLARE d int DEFAULT 0;
	DECLARE p int DEFAULT 0;
	-- 循环的设备编号
	DECLARE deviceCode varchar(20);
	DECLARE paramCode varchar(20);
	-- 定义设备列表、接口字段 游标,并将sql结果集赋值到游标中
	DECLARE deviceLists CURSOR FOR SELECT device_code from pcs_device_info where fk_pcs_id = pcsConfigId;
	DECLARE paramLists CURSOR FOR SELECT param_code from pcs_param_info where fk_pcs_id = pcsConfigId;
	-- 声明当游标遍历完后将标志变量置为某个值
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET d = 1;
	-- DECLARE CONTINUE HANDLER FOR NOT FOUND SET p = 1;
	
	SET @excuteSql = '';
	
	-- 打开游标
	OPEN deviceLists;
	-- 将游标中的值赋值给变量,注意:变量名不要与sql返回的列名相同,变量顺序要和sql结果列的顺序一致
	FETCH deviceLists INTO deviceCode;
	-- 当s不等于1时,也就是未遍历完时,会一直循环
	WHILE d <> 1 DO
	-- 执行业务逻辑
	SET @excuteSql = CONCAT(@excuteSql , ',	' , deviceCode);
	-- UPDATE member_album_count t SET t.img_pass_count = count WHERE t.member_id = memberId;
	-- 当s等于1时代表遍历已完成,退出循环
	FETCH deviceLists INTO deviceCode;
	END WHILE;
	-- 关闭游标
	CLOSE deviceLists;
-- 标识存储过程结束


		set @aaa = CONCAT("select '", @excuteSql,"' as aaaaa from pcs_device_info limit 1");
		PREPARE stmt FROM @aaa;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

		-- 处理返回值
		set changeCount = 1;
END;

-- 查询存储过程
-- SHOW PROCEDURE STATUS;
 
-- 调用
set @pcsConfigId = '1523956314869334094';
CALL savePcsPoint(@pcsConfigId, @changeCount);
select @changeCount;