目录配套资料,免费下载 第一章 数据库概述1.1、数据库的好处
1.2、数据库的常见概念
1.3、数据库的存储特点
1.4、数据库的常见分类
1.5、SQL语言的分类
第二章 MySQL概述2.1、MySQL的背景MySQL的前身是属于MySQL AB,08年被SUN公司收购,09年SUN公司又被Oracle公司收购 2.2、MySQL的优点
2.3、MySQL的安装2.4、MySQL的启动net start MySQL
2.5、MySQL的停止
2.6、MySQL的登录mysql -h主机名 -P端口号 -u用户名 -p密码
2.7、MySQL的退出
第三章 DQL语言3.1、基础查询一、语法 SELECT 查询列表 FROM 表名;
二、特点
三、示例 1、查询单个字段
2、查询多个字段 SELECT 字段名,字段名 FROM 表名;
3、查询所有字段
4、查询常量 SELECT 常量值;
注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要 5、查询函数
6、查询表达式 SELECT 100/25;
7、起别名
注意:别名可以使用单引号、双引号引起来,当只有一个单词时,可以省略引号,当有多个单词且有空格或特殊符号时,不能省略,AS可以省略 8、去重复 SELECT DISTINCT 字段名 FROM 表名;
9、做加法
10、【补充】ifnull函数 功能:判断某字段或表达式是否为null,如果为null,返回指定的值,否则返回原本的值 SELECT IFNULL(字段名, 指定值) FROM 表名;
11、【补充】isnull函数 功能:判断某字段或表达式是否为null,如果是null,则返回1,否则返回0
3.2、条件查询一、语法 SELECT 查询列表 FROM 表名 WHERE 筛选条件;
二、分类
三、演示 1、查询工资>12000的员工信息
2、查询工资>=14000的员工信息 SELECT * FROM employees WHERE salary >= 14000 ;
3、查询工资<12000的员工信息
4、查询工资<=14000的员工信息 SELECT * FROM employees WHERE salary <= 14000 ;
5、查询员工编号=100的员工信息
6、查询员工编号<=>100的员工信息 SELECT * FROM employees WHERE employee_id <=> 100 ;
注意:=只能判断普通类型的数值,而<=>不仅可以判断普通类型的数值还可以判断NULL 7、查询员工编号!=100的员工信息
8、查询员工编号<>100的员工信息 SELECT * FROM employees WHERE employee_id <> 100 ;
注意:!=和<>都是判断不等于的意思,但是MySQL推荐使用<> 9、查询工资>12000&&工资<18000的员工信息
10、查询工资<=12000||工资>=18000的员工信息 SELECT * FROM employees WHERE salary <= 12000 OR salary >= 18000 ;
11、查询工资<=12000||工资>=18000的员工信息
12、查询员工名中第一个字符为B、第四个字符为d的员工信息 SELECT *FROM employees WHERE last_name LIKE 'B__d%' ;
13、查询员工编号在100到120之间的员工信息
14、查询员工编号不在100到120之间的员工信息 SELECT * FROM employees WHERE employee_id NOT BETWEEN 100 AND 120 ;
15、查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
注意:in列表的值类型必须一致或兼容,in列表中不支持通配符%和_ 16、查询没有奖金的员工名和奖金率 SELECT last_name, commission_pct FROM employees WHERE commission_pct IS NULL ;
17、查询有奖金的员工名和奖金率
注意:=、!=不能用来判断NULL、而<=>、is null 、 is not null可以用来判断NULL,但注意<=>也可以判断普通类型的数值 3.3、排序查询一、语法 SELECT 查询列表 FROM 表 【WHERE 筛选条件】ORDER BY 排序列表 【asc | desc】 ;
二、注意
三、示例 1、按单个字段排序:查询员工信息,要求按工资降序
2、按多个字段查询:查询员工信息,要求先按工资降序,再按员工编号升序 SELECT * FROM employees ORDER BY salary DESC, employee_id ASC ;
3、按别名排序查询:查询员工信息,要求按员工年薪升序
4、按函数排序查询:查询员工信息,要求按员工名字的长度降序 SELECT LENGTH(last_name), last_name FROM employees ORDER BY LENGTH(last_name) DESC ;
5、按表达式排序:查询员工信息,要求按员工年薪升序
3.4、单行函数一、语法 SELECT 函数名(实参列表) 【FROM 表】;
二、分类
三、演示 1、concat SELECT CONCAT('Hello',' ','World') AS out_put;
2、substr
3、replace SELECT REPLACE('张无忌爱上了周芷若','周芷若','赵敏') AS out_put;
4、upper
5、lower SELECT LOWER('john') AS out_put;
6、lpad
7、rpad SELECT RPAD('殷素素',10,'*') AS out_put;
8、length
9、trim #删除指定字符的左右空格SELECT LENGTH(TRIM(' 张翠山 ')) AS out_put;#删除指定字符的指定字符SELECT TRIM('aaa' FROM 'aaaaaaaaa张翠山aaaaaaaaa') AS out_put;
10、instr
注意:返回子串第一次出现的索引,如果找不到返回0 11、round #默认四舍五入SELECT ROUND(-1.55) AS out_put;#指定小数位数SELECT ROUND(1.567,2) AS out_put;
注意:四舍五入和符号无关 12、ceil
注意:向上取整,返回>=该参数的最小整数 13、floor SELECT FLOOR(-9.99) AS out_put;
注意:向下取整,返回<=该参数的最大整数 14、mod
15、truncate SELECT TRUNCATE(1.69999,1) AS out_put;
16、rand
17、now SELECT NOW() AS out_put;
18、curdate
19、curtime SELECT CURTIME() AS out_put;
20、year
21、month SELECT MONTH(NOW()) 月;
22、day
23、hour SELECT HOUR(NOW()) 时;
24、minute
25、second SELECT SECOND(NOW()) 秒;
26、monthname
27、datediff SELECT DATEDIFF('1995-2-7','1995-2-6') AS out_put;
28、date_format
29、str_to_date SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d') AS out_put;
30、if
31、case的格式一 /*案例:查询员工的工资,要求部门号=30,显示的工资为1.1倍部门号=40,显示的工资为1.2倍部门号=50,显示的工资为1.3倍其它部门,显示的工资为原工资*/SELECT salary 原始工资, department_id, CASE department_id WHEN 30 THEN salary * 1.1 WHEN 40 THEN salary * 1.2 WHEN 50 THEN salary * 1.3 ELSE salary END AS 新工资 FROM employees ;
32、case的格式二
33、version SELECT VERSION();
34、database
35、user SELECT USER();
36、password(‘字符’)
37、md5(‘字符’) SELECT MD5('123456');
3.5、分组函数一、语法
二、分类
1、sum、avg一般用于处理数值型,max、min、count可以处理任何类型2、以上分组函数都忽略null值3、可以和distinct搭配实现去重的运算:select sum(distinct 字段) from 表;4、一般使用count(*)用作统计行数5、和分组函数一同查询的字段要求是group by后的字段
三、演示 1、sum
2、avg SELECT AVG(salary) FROM employees;
3、max
4、min SELECT MIN(salary) FROM employees;
5、count
3.6、分组查询一、语法 SELECT 查询列表 FROM 表 【where 筛选条件】 GROUP BY 分组的字段 【having 分组后的筛选】【order BY 排序的字段】 ;
二、特点
三、演示 1、查询每个工种的员工平均工资 SELECT AVG(salary), job_id FROM employees GROUP BY job_id ;
2、查询每个位置的员工部门个数
3、查询有奖金的每个领导手下员工的平均工资 SELECT AVG(salary), manager_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY manager_id ;
4、查询哪个部门的员工个数>5
5、查询每个工种有奖金的员工的最高工资>6000的最高工资和公众编号,按最高工资升序 SELECT MAX(salary) m, job_idFROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING m > 6000 ORDER BY m ;
6、查询每个工种每个部门的最低工资并按最低工资降序
3.7、连接查询一、含义 连接查询又称多表查询,当查询的字段来自于多个表时,就会用到连接查询 二、注意 笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行发生原因:没有有效的连接条件如何避免:添加有效的连接条件
三、分类
四、sql92标准演示 1、sql92标准:等值连接
2、sql92标准:非等值连接 #查询员工的工资和工资级别SELECT salary, grade_level FROM employees e, job_grades g WHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal` ;
3、sql92标准:自连接
3.8、sql99标准一、语法 SELECT 查询列表 FROM 表1 别名1 【连接类型】 JOIN 表2 别名2 ON 连接条件 【where 分组前筛选条件】【group BY 分组列表】【having 分组后筛选条件】【order BY 排序列表】 ;
二、连接类型
三、演示 1、内连接:等值连接
2、内连接:非等值连接 #查询员工的工资和工资级别SELECT salary, grade_level FROM employees e INNER JOIN job_grades g ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal` ;
3、内连接:自连接
4、外连接:左外连接 #查询哪个部门没有员工SELECT d.`department_name`FROM departments d LEFT OUTER JOIN employees e ON d.`department_id` = e.`department_id` WHERE e.`employee_id` IS NULL ;
5、外连接:右外连接
6、交叉连接 #使用交叉连接进行笛卡尔乘积查询SELECT b.*, bo.* FROM beauty b CROSS JOIN boys bo ;
3.9、子查询一、含义 嵌套在其它语句内部的select语句称为子查询或内查询,外面的语句可以是insert、delete、update、select等,一般select作为外面语句较多,外面如果为select语句,则此语句称为外查询或主查询 二、分类
三、特点
四、演示 1、select后面
2、from后面 #查询每个部门平均工资的工资等级SELECT ag_dep.*, g.`grade_level` FROM ( SELECT AVG(salary) ag, department_id FROM employees GROUP BY department_id) ag_dep INNER JOIN job_grades g ON ag_dep.ag BETWEEN lowest_sal AND highest_sal ;
3、where或having后面 标量子查询:查询最低工资的员工姓名和工资
列子查询: #查询所有是领导的员工姓名SELECT last_name FROM employees WHERE employee_id IN (SELECT DISTINCT manager_id FROM employees) ;
#返回其它部门中比job_id为‘IT_PROG’部门所有工资都低的员工的员工号、姓名、job_id以及salarySELECT employee_id, last_name, job_id, salary FROM employees WHERE salary < ALL ( SELECT DISTINCT salary FROM employees WHERE job_id = 'IT_PROG') AND job_id <> 'IT_PROG' ;
行子查询:查询员工编号最小并且工资最高的员工信息
4、exists后面 #查询有员工的部门名SELECT department_name FROM departments d WHERE EXISTS (SELECT * FROM employees eWHERE e.`department_id` = d.`department_id`) ;
3.10、分页查询一、语法
二、特点
三、演示 #查询前五条员工信息SELECT * FROM employees LIMIT 0,5;
3.11、联合查询一、语法
二、特点
三、演示 #查询中国用户中男性的信息以及外国用户中年男性的用户信息SELECT id,cname FROM t_ca WHERE csex='男'UNION ALLSELECT t_id,tname FROM t_ua WHERE tGender='male';
第四章 DML语言4.1、插入语句一、语法
二、特点
三、演示 1、方式一:插入数据 INSERT INTO beauty(id,name,sex,borndate,phone,photo,boyfriend_id) VALUES(15,'唐艺昕','女','1997-12-05','15633029014',NULL,2);
2、方式二:插入数据
4.2、修改语句一、语法 1、单表更新UPDATE 表名 SET 列 = 值,... WHERE 查询条件;2、多表更新#sql92语法: UPDATE 表1 别名, 表2 别名 SET 列 = 值, ...WHERE 连接条件 AND 筛选条件 ;#sql99语法: UPDATE 表1 别名 INNER | LEFT | RIGHT JOIN 表2 别名 ON 连接条件 SET 列 = 值, ...WHERE 筛选条件 ;
二、演示 1、单表更新
2、多表更新 #修改张无忌的女朋友的手机号为13899888899,魅力值为1000sql92语法:UPDATE boys bo, beauty b SET b.`phone` = '13899888899', bo.`userCP` = 1000 WHERE bo.`id` = b.`boyfriend_id` AND bo.`boyName` = '张无忌' ;#修改张无忌的女朋友的手机号为13899888899,魅力值为1000sql99语法:UPDATE boys bo INNER JOIN beauty b ON bo.`id` = b.`boyfriend_id` SET b.`phone` = '13899888899', bo.`userCP` = 1000 WHERE bo.`boyName` = '张无忌' ;
4.3、删除语句一、语法
二、演示 1、单表删除 #删除手机号以9结尾的女神信息DELETE FROM beauty WHERE phone LIKE '%9';
2、多表删除
第五章 DDL语言5.1、库的管理5.1.1、库的创建CREATE DATABASE 【IF NOT EXISTS】 库名 【 CHARACTER SET 字符集名】;
5.1.2、库的修改
5.1.3、库的删除DROP DATABASE 【IF EXISTS】 库名;
5.2、表的管理5.2.1、表的创建
5.2.2、表的修改1、添加列ALTER TABLE 表名 ADD COLUMN 列名 类型 【FIRST|AFTER 字段名】;2、修改列的类型或约束ALTER TABLE 表名 MODIFY COLUMN 列名 新类型 【新约束】;3、修改列名ALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 类型;4、删除列ALTER TABLE 表名 DROP COLUMN 列名;5、修改表名ALTER TABLE 表名 RENAME 【TO】 新表名;
5.2.3、表的删除
5.2.4、表的复制1、复制表的结构CREATE TABLE 表名 LIKE 旧表;2、复制表的某些字段CREATE TABLE 表名 SELECT 字段1,字段2,... FROM 旧表 WHERE 0;3、复制表的结构+数据CREATE TABLE 表名 SELECT 查询列表 FROM 旧表 【WHERE 筛选条件】;4、复制表的某些字段+数据CREATE TABLE 表名 SELECT 字段1,字段2,... FROM 旧表 【WHERE 筛选条件】;
5.3、数据类型5.3.1、数值型一、类型
二、特点
5.3.2、浮点型一、类型
二、特点
5.3.3、字符型一、类型
二、特点
5.3.4、日期型一、类型
二、特点
5.4、常见约束一、含义 约束是一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性 二、分类
三、特点 主键和唯一
外键 1、用于限制两个表的关系,从表的字段值引用了主表的某字段值2、外键列和主表的被引用列要求类型一致,意义一样,名称无要求3、主表的被引用列要求是一个key(一般就是主键)4、插入数据,先插入主表;删除数据,先删除从表可以通过以下两种方式来删除主表的记录#方式一:级联删除ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;#方式二:级联置空ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;
四、演示 1、创建表时添加约束
注意:
2、修改表时添加或删除约束 1、非空添加非空(列级约束)ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型 NOT NULL;删除非空ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型;2、默认添加默认(列级约束)ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型 DEFAULT 值;删除默认ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型;3、主键添加主键(列级约束)ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型 PRIMARY KEY;添加主键(表级约束)ALTER TABLE 表名 add 【CONSTRAINT 约束名】 PRIMARY KEY(字段名);删除主键ALTER TABLE 表名 DROP PRIMARY KEY;4、唯一添加唯一(列级约束)ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型 UNIQUE;添加唯一(表级约束)ALTER TABLE 表名 add 【CONSTRAINT 约束名】 UNIQUE(字段名);删除唯一ALTER TABLE 表名 DROP INDEX 索引名;5、外键添加外键(表级约束)ALTER TABLE 表名 add 【CONSTRAINT 约束名】 FOREIGN KEY(字段名) REFERENCES 主表(被引用列);删除外键ALTER TABLE 表名 DROP FOREIGN KEY 约束名;
5.5、自增长列一、含义 自增长列又称为标识列,它可以不用手动的插入值,系统提供默认的序列值 二、特点
三、演示 1、创建表时添加自增长列
2、修改表时添加或删除自增长列 添加自增长列ALTER TABLE 表 MODIFY COLUMN 字段名 字段类型 约束 AUTO_INCREMENT;删除自增长列ALTER TABLE 表 MODIFY COLUMN 字段名 字段类型 约束;
第六章 DCL语言关于授权的权限列表: 6.1、创建用户
6.2、删除用户DROP USER 用户名@'IP地址';注意:'IP地址'可以设置为localhost(代表本机)或者'%'(代表允许所有IP地址登录)
6.3、用户授权
6.4、撤销授权REVOKE 权限1,权限2,...... ON 数据库名.* FROM 用户名@'IP地址' IDENTIFIED BY '密码';注意:所有的数据库就用*.*,所有的权限就用all或者all privileges
6.5、刷新授权
6.6、查看授权SHOW GRANTS FOR 用户名@'IP地址';注意:'IP地址'可以设置为localhost(代表本机)或者'%'(代表允许所有IP地址登录)
6.7、修改密码
第七章 TCL语言7.1、事务一、含义 一条或多条sql语句组成一个执行单位,一组sql语句要么都执行要么都不执行 二、特点(ACID)
三、分类
1、开启事务set autocommit=0;#关闭自动提交start transaction;#开启事务机制2、编写一组逻辑sql语句注意:sql语句支持的是insert、update、delete【设置回滚点,可选项】savepoint 回滚点名;3、结束事务提交:commit;回滚:rollback;回滚到指定的地方: rollback to 回滚点名;
7.2、事务并发(读问题)一、事物的并发问题如何发生? 多个事务同时操作同一个数据库的相同数据时 二、事务的并发问题都有哪些?
三、事物的并发问题如何解决? 通过设置隔离级别来解决并发问题 四、隔离级别
五、注意问题
7.3、丢失更新(写问题)一、定义 在事务的隔离级别内容中,能够了解到两个不同的事务在并发的时候可能会发生数据的影响。细心的话可以发现事务隔离级别章节中,脏读、不可重复读、幻读三个问题都是由事务A对数据进行修改、增加,事务B总是在做读操作。如果两事务都在对数据进行修改则会导致另外的问题:丢失更新。 二、解决
三、注意 对于账户交易建议直接使用悲观锁,数据库的性能很高,并发度不是很高的场景两者性能没有太大差别。如果是交易减库存的操作可以考虑乐观锁,保证并发度。 第八章 高级部分8.1、索引一、含义 索引(index)是帮助MySQL高效获取数据的一种有序的数据结构 二、特点
三、语法 1、创建
2、修改 先删除,在创建
3、删除
4、查看 SHOW INDEX FROM 表名;
5、alter命令
四、注意 索引的设计可以遵循一些已有的原则,创建索引的时候请尽量考虑符合这些原则,便于提升索引的使用效率,更高效的使用索引:
8.2、视图一、含义 MySQL在5.1以后推出了视图(VIEW),本身是一个虚拟表,它的数据来自于表,通过执行时动态生成 二、特点
三、语法 1、创建 CREATE VIEW 视图名AS查询语句;
2、修改
3、删除 DROP VIEW 视图1,视图2,...;
4、查看
四、注意 视图一般用于查询的,而不是更新的,所以具备以下特点的视图都不允许更新:
8.3、存储过程8.3.1、语法一、含义 存储过程,类似于Java中的方法,它是一组预先编译好的SQL语句的集合,理解成批处理语句 二、特点
三、语法 1、创建 #标准格式如下:DELIMITER $CREATE PROCEDURE 存储过程名(参数模式 参数名 参数类型,...)BEGIN存储过程体(一组合法的SQL语句)END $DELIMITER ;#参数模式in:参数类型是输入的#参数模式out:参数类型是输出的#参数模式inout:参数类型既可以输入也可以输出#调用in模式的参数: CALL sp1('Hello,World');#调用out模式的参数: SET @name; CALL sp1(@name); SELECT @name;#调用inout模式的参数: SET @name=值; CALL sp1(@name); SELECT @name;
2、修改
3、删除 DROP PROCEDURE 存储过程名;
4、查看
8.3.2、变量一、分类
二、语法 1、全局变量 描述:服务器层面上的,必须拥有super权限才能为系统变量赋值,作用域为整个服务器,也就是针对于所有连接(会话)有效,但不能跨重启 1、查看所有系统变量SHOW GLOBAL VARIABLES;2、查看满足条件的部分系统变量SHOW GLOBAL VARIABLES LIKE '%char%';3、查看指定的系统变量的值SELECT @@global 系统变量名;4、为某个系统变量赋值方式一: SET GLOBAL 系统变量名=值;方式二: SET @@global 系统变量名=值;
2、会话变量 描述:服务器为每一个连接的客户端都提供了系统变量,作用域为当前的连接(会话)
3、用户变量 描述:针对于当前连接(会话)生效 位置:可以在begin end里面,也可以放在外面 1、声明并赋值SET @变量名=值; 或SET @变量名:=值; 或SELECT @变量名:=值;2、更新值方式一:SET @变量名=值; 或SET @变量名:=值; 或SELECT @变量名:=值;方式二:SELECT xxx INTO @变量名 FROM 表;3、查看值SELECT @变量名;
4、局部变量 描述:作用域:仅仅在定义它的begin end中有效
8.3.3、分支结构8.3.3.1、if结构一、语法 注意:只能应用在begin end中 IF 条件1 THEN 语句1;ELSEIF 条件2 THEN 语句2;ELSEIF 条件3 THEN 语句3;....【 ELSE 语句n; 】END IF;
二、演示
8.3.3.2、case结构一、语法 注意:只能应用在begin end中 语法1:CASE 表达式或字段WHEN 值1 THEN 语句1;WHEN 值2 THEN 语句2;...【 ELSE 语句n; 】END 【 CASE 】;语法2:CASE WHEN 条件1 THEN 语句1;WHEN 条件2 THEN 语句2;...【 ELSE 语句n; 】END 【 CASE 】;
二、演示
8.3.4、循环结构一、分类 二、演示 8.3.4.1、while结构#批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止#删除过程DROP PROCEDURE IF EXISTS test_while;#定义过程DELIMITER $CREATE PROCEDURE test_while(IN insertCount INT)BEGINDECLARE i INT DEFAULT 1;a:WHILE i<=insertCount DO#LEAVE代表Java中的break关键字;ITERATE代表Java中的continue关键字IF i>20 THEN LEAVE a;END IF;INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');SET i=i+1;END WHILE a;END $DELIMITER ;#调用过程CALL test_while(100);
8.3.4.2、repeat结构
8.3.4.3、loop结构#批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止#删除过程DROP PROCEDURE IF EXISTS test_loop;#定义过程DELIMITER $CREATE PROCEDURE test_loop(IN insertCount INT)BEGINDECLARE i INT DEFAULT 1;a:LOOP #LEAVE代表Java中的break关键字;ITERATE代表Java中的continue关键字IF i>20 THEN LEAVE a;END IF;INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');SET i=i+1;END LOOP a;END $DELIMITER ;#调用过程CALL test_loop(100);
8.3.5、游标一、含义 游标是用来存储查询结果集的数据类型 , 在存储过程和函数中可以使用光标对结果集进行循环的处理 二、语法 1、声明游标
2、打开游标 OPEN 游标名称;
3、获取游标
4、关闭游标 CLOSE 游标名称;
三、演示 建数据表以用来演示
循环获取该表的内容 DELIMITER $CREATE PROCEDURE getAllRowsForEmpTable()BEGIN DECLARE e_id INT(11); DECLARE e_name VARCHAR(50); DECLARE e_age INT(11); DECLARE e_salary INT(11); DECLARE has_data INT DEFAULT 1; DECLARE emp_result CURSOR FOR SELECT * FROM emp; DECLARE EXIT HANDLER FOR NOT FOUND SET has_data=0; OPEN emp_result; REPEAT FETCH emp_result INTO e_id,e_name,e_age,e_salary; SELECT CONCAT('id=',e_id , ', name=',e_name, ', age=', e_age, ', salary=',e_salary) as emp_info; UNTIL has_data = 0 END REPEAT; CLOSE emp_result;END$DELIMITER ;
打开命令行调用查看
8.4、函数一、含义 其实函数就是一个有返回值的过程 二、语法 1、创建 DELIMITER $CREATE FUNCTION 函数名(参数名 参数类型) RETURNS 返回类型BEGIN函数过程体(一组合法的SQL语句)END $DELIMITER ;
2、修改
3、删除 DROP FUNCTION 函数名;
4、查看
5、调用 SELECT 函数名(实参列表);
三、注意
8.5、触发器一、含义 MySQL在5.0以后推出了触发器(TRIGGER),触发器是与表有关的数据库对象,指在 insert/update/delete 之前或之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性、日志记录 、数据校验等操作。使用别名 OLD 和 NEW 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在MySQL触发器还只支持行级触发,不支持语句级触发 二、分类
三、语法 1、创建
2、更新 先删除,在创建
3、删除
4、查看 SHOW TRIGGERS;
四、演示 创建数据表以用来演示
编写触发器进行测试 创建 insert 型触发器,完成插入数据时的日志记录: DELIMITER $CREATE TRIGGER emp_logs_insert_triggerAFTER INSERT ON emp FOR EACH ROW BEGIN INSERT INTO emp_logs (id,operation,operate_time,operate_id,operate_params) VALUES(NULL,'insert',NOW(),new.id,CONCAT('插入后(id:',new.id,', name:',new.name,', age:',new.age,', salary:',new.salary,')'));END $DELIMITER ;
创建 update 型触发器,完成更新数据时的日志记录:
创建delete 行的触发器 , 完成删除数据时的日志记录: DELIMITER $CREATE TRIGGER emp_logs_delete_triggerAFTER DELETE ON emp FOR EACH ROW BEGIN INSERT INTO emp_logs (id,operation,operate_time,operate_id,operate_params) VALUES(NULL,'delete',NOW(),old.id,CONCAT('删除前(id:',old.id,', name:',old.name,', age:',old.age,', salary:',old.salary,')')); END $DELIMITER ;
依次调用以下的语句,查看emp_logs是否有触发器保存的日志记录
8.6、事件一、含义 MySQL在5.1以后推出了事件调度器(Event Scheduler),与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发 二、特点
三、语法 1、创建 MySQL事件调度器event_scheduler负责调用事件,它默认是关闭的。这个调度器不断地监视一个事件是否要调用, 要创建事件,必须打开调度器。 #开启事件调度器(任意一个都可以)SET GLOBAL event_scheduler = ON; SET @@global.event_scheduler = ON; SET GLOBAL event_scheduler = 1; SET @@global.event_scheduler = 1; #关闭事件调度器(任意一个都可以)SET GLOBAL event_scheduler = OFF; SET @@global.event_scheduler = OFF; SET GLOBAL event_scheduler = 0; SET @@global.event_scheduler = 0;
2、修改 先删除,在创建
3、删除
4、查看 SHOW EVENTS;
5、调用
四、注意
第九章 数据备份与恢复9.1、数据导出1、导出某张数据表 #格式:mysqldump -u账户 -p密码 数据库名 数据表名 > 文件保存路径mysqldump -uroot -p123456 test emp > D:/emp.sql
2、导出整个数据库
9.2、数据导入1、导入某张数据表 #格式:mysql -u账户 -p密码# use 数据库名;# source 文件保存路径mysql -uroot -p123456>use test;>source D:/emp.sql
2、导入整个数据库
第十章 安装MySQL单实例10.1、准备虚拟机虚拟机配置:全新系统,桌面版 虚拟机地址:进入系统,可上网 连接的工具:自行百度,在下载 SecureCRT:7.0.0 10.2、删除自带库[root@caochenlei ~]# rpm -qa | grep mysqlmysql-libs-5.1.73-8.el6_8.x86_64[root@caochenlei ~]# rpm -e mysql-libs-5.1.73-8.el6_8.x86_64 --nodeps
10.3、安装依赖包
10.4、下载服务端下载: [root@caochenlei ~]# wget https://cdn.//Downloads/MySQL-5.6/MySQL-server-5.6.49-1.el6.x86_64.rpm
查看:
10.5、安装服务端[root@caochenlei ~]# rpm -ivh MySQL-server-5.6.49-1.el6.x86_64.rpm
10.6、下载客户端下载:
查看: [root@caochenlei ~]# ll MySQL-client-5.6.49-1.el6.x86_64.rpm-rw-r--r--. 1 root root 21584380 6月 3 13:36 MySQL-client-5.6.49-1.el6.x86_64.rpm
10.7、安装客户端
10.8、启动数据库服务[root@caochenlei ~]# service mysql startStarting MySQL.Logging to '/var/lib/mysql/caochenlei.err'... [确定]
10.9、查看初始化密码
10.10、修改初始化密码登录: [root@caochenlei ~]# mysql -uroot -pE4qT_4CJ9YNf0daG
修改:
10.11、远程的授权授权: mysql> grant all privileges on *.* to 'root'@'%' identified by '123456';Query OK, 0 rows affected (0.00 sec)
刷新:
退出: mysql> exitBye
10.12、开放防火墙
10.13、添加自启动[root@caochenlei ~]# chkconfig --add mysql[root@caochenlei ~]# chkconfig mysql on
10.14、测试连接10.15、关闭系统
第十一章 安装MySQL主从复制11.1、准备虚拟机复制CentOS 6 64 bit-1 > CentOS 6 64 bit-2 启动CentOS 6 64 bit-1: 启动CentOS 6 64 bit-2:选择“我已复制该虚拟机” 11.2、主从复制介绍主从复制允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。 11.3、主从复制架构实现目标:一主一从 11.4、主节点配置编辑:
[root@caochenlei ~]# vi /usr/my.cnf
添加:
重启: [root@caochenlei ~]# service mysql restartShutting down MySQL... [确定]Starting MySQL..... [确定]
连接:
授权: mysql> grant replication slave on *.* to 'root'@'%' identified by '123456';Query OK, 0 rows affected (0.03 sec)
刷新:
查看: mysql> show master status\G*************************** 1. row *************************** File: mysql-bin.000001 Position: 397 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.00 sec)
11.5、从节点配置编辑:
添加:
#日志名称log-bin=mysql-bin#日志格式:row、statement、mixedbinlog-format=row#服务器ID标识server-id=2#是否只读read_only=1
停止:
删除:
[root@caochenlei ~]# rm -f /var/lib/mysql/auto.cnf
启动:
连接: [root@caochenlei ~]# mysql -uroot -p123456
执行:
开启: mysql> start slave;Query OK, 0 rows affected (0.03 sec)
查看:
11.6、连接测试测试连接:192.168.206.128(master) 创建数据库: CREATE DATABASE `mytest` CHARACTER SET utf8 ;
创建数据表:
添加数据集: INSERT INTO `mytest`.`myuser` (`id`, `username`, `password`) VALUES ('1', 'zhangsan', '123456'); INSERT INTO `mytest`.`myuser` (`id`, `username`, `password`) VALUES ('2', 'lisi', '123456'); INSERT INTO `mytest`.`myuser` (`id`, `username`, `password`) VALUES ('3', 'wangwu', '123456');
查看数据集:
连接测试:192.168.206.129(slave) 查看数据集: USE mytest; SELECT * FROM myuser;
最终的结论: 我们会发现我们只在192.168.206.128(master)创建数据库、创建表、添加数据,而它的从节点会自动的拉取主节点的内容,这就是所谓的主从复制了。 第十二章 安装MySQL读写分离12.1、环境准备复制CentOS 6 64 bit-2 > CentOS 6 64 bit-3
启动CentOS 6 64 bit-3:选择“我已复制该虚拟机” 12.2、读写分离介绍以上已经完成了主从复制(一主一从)配置,然而这只是一个基本配置,加上一个proxysql实现MySQL读写分离,proxysql支持MySQL协议的的数据库代理,程序访问的不再是具体的数据库,而是proxysql这个代理程序,用户请求发向proxysql,如果是写请求发往主节点,读请求发下从节点组中,以此实现读写分离一定程序上减轻了主数据库的io压力。 12.3、读写分离架构实现目标:一主两从,基于上文中的一主一从,我们重新复制一个从节点,进行少量修改即可 12.4、修改从节点二
停止:
删除: [root@caochenlei ~]# rm -f /var/lib/mysql/auto.cnf
修改:
#服务器ID标识server-id=3
启动:
登录: [root@caochenlei ~]# mysql -uroot -p123456
查看:
测试: 第一步:在主节点(192.168.206.128)插入数据 INSERT INTO `mytest`.`myuser` (`id`, `username`, `password`) VALUES ('9', 'xiaojiu', '123456');USE mytest; SELECT * FROM myuser;
第二步:在从节点(192.168.206.129)查看数据
第三步:在从节点(192.168.206.130)查看数据 USE mytest; SELECT * FROM myuser;
12.5、安装proxysql设下载源:
安装依赖: [root@caochenlei ~]# yum install -y mysql-libs perl-DBI perl-DBD-MySQL
开始安装:
开放端口: [root@caochenlei ~]# /sbin/iptables -I INPUT -p tcp --dport 6032 -j ACCEPT[root@caochenlei ~]# /etc/rc.d/init.d/iptables saveiptables:将防火墙规则保存到 /etc/sysconfig/iptables:[确定][root@caochenlei ~]# /sbin/iptables -I INPUT -p tcp --dport 6033 -j ACCEPT[root@caochenlei ~]# /etc/rc.d/init.d/iptables saveiptables:将防火墙规则保存到 /etc/sysconfig/iptables:[确定]
添加自启动:
删除文件: [root@caochenlei ~]# rm -f /etc/proxysql.cnf
新增文件:
datadir='/var/lib/proxysql'errorlog='/var/lib/proxysql/proxysql.log'admin_variables={ #本地登录的账号和密码 admin_credentials='admin:admin' #本地登录的IP和端口号 mysql_ifaces='0.0.0.0:6032'}mysql_variables={ threads=4 max_connections=2048 default_query_delay=0 default_query_timeout=36000000 have_compress=true poll_timeout=2000 #远程登录的IP和端口号 interfaces='0.0.0.0:6033' default_schema='information_schema' stacksize=1048576 server_version='5.5.30' connect_timeout_server=3000 #监控账号的账号和密码 monitor_username='monitor' monitor_password='monitor' monitor_history=600000 monitor_connect_interval=60000 monitor_ping_interval=10000 monitor_read_only_interval=1500 monitor_read_only_timeout=500 ping_interval_server_msec=120000 ping_timeout_server=500 commands_stats=true sessions_sort=true connect_retries_on_failure=10}#以下的配置我们会采用动态语句的形式配置mysql_servers =()mysql_users:()mysql_query_rules:()scheduler=()mysql_replication_hostgroups=()
启动服务:
12.6、删除自带库[root@caochenlei ~]# rpm -qa | grep mysqlmysql-libs-5.1.73-8.el6_8.x86_64[root@caochenlei ~]# rpm -e mysql-libs-5.1.73-8.el6_8.x86_64 --nodeps
12.7、安装依赖包
12.8、下载服务端下载: [root@caochenlei ~]# wget https://cdn.//Downloads/MySQL-5.6/MySQL-server-5.6.49-1.el6.x86_64.rpm
查看:
12.9、安装服务端[root@caochenlei ~]# rpm -ivh MySQL-server-5.6.49-1.el6.x86_64.rpm
12.10、下载客户端下载:
查看: [root@caochenlei ~]# ll MySQL-client-5.6.49-1.el6.x86_64.rpm-rw-r--r--. 1 root root 21584380 6月 3 13:36 MySQL-client-5.6.49-1.el6.x86_64.rpm
12.11、安装客户端
12.12、启动数据库服务[root@caochenlei ~]# service mysql startStarting MySQL.Logging to '/var/lib/mysql/caochenlei.err'... [确定]
12.13、查看初始化密码
12.14、修改初始化密码登录: [root@caochenlei ~]# mysql -uroot -pIFIn7pcTznYpoLm1
修改:
退出: mysql> exitBye
12.15、创建两个账号这个操作是在master节点进行的,创建完成后,会自动复制到从节点,方便proxysql后来的监控和远程登录的认证连接
为proxysql创建监控账号(主要做监控使用):
为proxysql创建远程账号(主要是远程登录): create user 'proxysql'@'%' identified by 'proxysql';grant all privileges on *.* to 'proxysql'@'%' identified by 'proxysql';flush privileges;
退出:
12.16、配置proxysql这个操作是在安装proxysql的这台机器上的操作,6032端口的默认账号密码为admin,如果想要修改请在第12.5步修改,然后重启。 [root@caochenlei ~]# mysql -uadmin -padmin -h127.0.0.1 -P6032 --prompt 'admin>'
分别执行以下语句
执行完成以后退出 12.17、连接proxysql
第一种:远程命令行连接测试 主节点、两个从节点随便找一台测试一下: ##连接[root@caochenlei ~]# mysql -uproxysql -pproxysql -h192.168.206.131 -P6033##查看所有数据库mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || mytest || performance_schema || test |+--------------------+5 rows in set (0.05 sec)
第二种:远程图形化窗口连接 注意这个端口是6033而不是3306,账号和密码我之前设置的都是proxysql 12.18、查询监控数据如果想要查看sql语句在哪个数据库执行的,在proxysql机器上请执行以下语句
第十三章 安装MySQL分片集群13.1、环境准备我们使用之前的读写分离时候配置的一主两从这三台服务器,至于那个读写分离的数据库中间件proxysql服务器就用不着了,直接关机就行了,以下三台依次从主节点开始启动即可也就是CentOS 6 64 bit-1、CentOS 6 64 bit-2、CentOS 6 64 bit-3 13.2、分片集群介绍如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。 但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的。这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据库。如果使用关系型数据库解决海量存储的问题呢?此时就需要做数据库集群,为了提高查询性能将一个数据库的数据分散到不同的数据库中存储。简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。而这其中,我们需要使用一个数据库中间件来完成,它就是Mycat。 13.3、分片集群架构实现目标:一主两从需要三组,再加上一个数据库中间件服务器,一共需要10台 如何演示:但实际上呢,这个分片集群是在主从复制模式上进行的演进,说白了,上边的3组一主两从,随便拿出来一个都是一个主从复制模式,那我们前一章已经完成了一主两从的学习,也就是已经配置好了这三台服务器,我们要是再拷贝出来两组就显得太麻烦了,学习嘛,怎么简单怎么来,现在我们手头只有一组,那我们就在这一组上进行演示,也就是一组上创建三个数据库,我们学习的架构就是下边这样了和上边的效果一模一样,如下图: 13.4、Mycat的介绍Mycat 背后是阿里曾经开源的知名产品——Cobar。Cobar 的核心功能和优势是 MySQL 数据库分片,此产品曾经广为流传,据说最早的发起者对 MySQL 很精通,后来从阿里跳槽了,阿里随后开源的 Cobar,并维持到 2013 年年初,然后,就没有然后了。 Cobar 的思路和实现路径的确不错。基于 Java 开发的,实现了 MySQL 公开的二进制传输协议,巧妙地将自己伪装成一个 MySQL Server,目前市面上绝大多数 MySQL 客户端工具和应用都能兼容。比自己实现一个新的数据库协议要明智的多,因为生态环境在哪里摆着。 Mycat 是基于 cobar 演变而来,对 cobar 的代码进行了彻底的重构,使用 NIO 重构了网络模块,并且优化了 Buffer 内核,增强了聚合,Join 等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。 简单的说,MyCAT就是一个新颖的数据库中间件产品,支持mysql集群或者mariadb集群,提供高可用性数据分片集群。你可以像使用mysql一样使用mycat。对于开发人员来说根本感觉不到mycat的存在。 它支持的数据库产品非常的多如: 13.5、Mycat的分片分片就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。 数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。 (1)一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切分可以称之为数据的垂直(纵向)切分 (2)另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。 13.6、Mycat的安装官方网址:Mycat 默认端口:8066 JDK:要求jdk必须是1.7及以上版本 MySQL:推荐mysql是5.5及以上版本 安装JDK8: #查看软件rpm -qa | grep javarpm -qa | grep jdk#批量卸载rpm -qa | grep jdk | xargs rpm -e --nodepsrpm -qa | grep java | xargs rpm -e --nodeps#在线安装yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel#通过yum方式安装默认安装在/usr/lib/jvm文件下,看看你自己安装的具体是哪个版本ll /usr/lib/jvm/#编辑/etc/profile文件,在文件最后写入环境变量,然后保存退出vi /etc/profile# java environmentexport JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el6_10.x86_64export JRE_HOME=$JAVA_HOME/jreexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/jre/lib/tools.jar:$JRE_HOME/lib:$CLASSPATHexport PATH=$JAVA_HOME/bin:$PATH#使环境变量生效source /etc/profile#查看安装是否成功,这两个都能出来就安装成功了[root@caochenlei ~]# java -versionopenjdk version '1.8.0_262'OpenJDK Runtime Environment (build 1.8.0_262-b10)OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)[root@caochenlei ~]# javac -versionjavac 1.8.0_262
下载:
解压: [root@caochenlei ~]# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
安装:
添加防火墙:
[root@caochenlei ~]# /sbin/iptables -I INPUT -p tcp --dport 8066 -j ACCEPT[root@caochenlei ~]# /sbin/iptables -I INPUT -p tcp --dport 9066 -j ACCEPT[root@caochenlei ~]# /etc/rc.d/init.d/iptables saveiptables:将防火墙规则保存到 /etc/sysconfig/iptables:[确定]
添加域名解析:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6#配置当前主机名称的域名解析192.168.206.128 caochenlei#配置一主两从服务的域名解析192.168.206.128 master1192.168.206.129 slave1192.168.206.130 slave2
常用命令:
13.7、Mycat的配置第一步:登录主节点创建三个数据库分别是db1、db2、db3
第二步:修改schema.xml文件 删除原有配置 [root@caochenlei ~]# rm -f /usr/local/mycat/conf/schema.xml
新增我们配置
<?xml version='1.0'?><!DOCTYPE mycat:schema SYSTEM 'schema.dtd'><mycat:schema xmlns:mycat='http://cat/'><schema name='STOREDB' checkSQLschema='false' sqlMaxLimit='100'><!-- rule采用按主键范围分片,主键名为id(默认) --><table name='TB_USERS' dataNode='dn1,dn2,dn3' rule='auto-sharding-long' /><!-- rule采用按哈希一致分片,主键名为order_id(自己修改) --><table name='TB_ORDER' dataNode='dn1,dn2,dn3' rule='sharding-by-murmur-order' /></schema><dataNode name='dn1' dataHost='OneMasterAndTwoSlave' database='db1' /><dataNode name='dn2' dataHost='OneMasterAndTwoSlave' database='db2' /><dataNode name='dn3' dataHost='OneMasterAndTwoSlave' database='db3' /><dataHost name='OneMasterAndTwoSlave' maxCon='1000' minCon='10' balance='0' writeType='0' dbType='mysql' dbDriver='native' switchType='1' slaveThreshold='100'><!-- 心跳语句 --><heartbeat>select user()</heartbeat><!-- 一主两从 --><writeHost host='hostM1' url='master1:3306' user='root' password='123456'><readHost host='hostS1' url='slave1:3306' user='root' password='123456' /><readHost host='hostS2' url='slave2:3306' user='root' password='123456' /></writeHost></dataHost></mycat:schema>
第三步:修改server.xml文件 server.xml几乎保存了所有mycat需要的系统配置信息,最常用的是在此配置用户名、密码及权限。
在system中添加UTF-8字符集设置,否则存储中文会出现问号。 <property name='charset'>utf8</property>
修改user的设置 , 我们这里为STOREDB数据库设置了两个用户。把它之前的两个用户删掉,把咱们自己设置的放进去。
第四步:修改auto-sharding-rang-mod.txt文件 修改主键范围分片大小 删除: [root@caochenlei ~]# rm -f /usr/local/mycat/conf/auto-sharding-rang-mod.txt
新增:
0-500M=0500M1-1000M=11000M1-1500M=2
第五步:修改rule.xml文件
新增哈希订单主键,因为默认主键名都是id,要想是自己定义的,就拷贝一份,重新起个名,然后修改columns成你数据表的那个主键名称就行了 <tableRule name='sharding-by-murmur-order'> <rule> <columns>order_id</columns> <algorithm>murmur</algorithm> </rule> </tableRule>
修改分片数量,因为现在有db1、db2、db3个分片,找到
13.8、Mycat的启动在启动之前,我们需要做一个密码重置的工作,也不知道这是不是个BUG,但是,你要不做密码重置,很可能Mycat它启动不起来,我也是醉了,就这一个问题,搞了我一晚上的心态,操作步骤如下: 依次在主节点、从节点一、从节点二执行以下四条语句: use mysql;update user set password = password('123456') where user = 'root';flush privileges;set password for 'root' = password('123456');#如果上句报错使用下边这个,不报错就算了set password = password('123456');
然后再启动Mycat
13.9、Mycat的测试
创建用户表,然后插入数据,直接拷贝以下SQL代码到窗口,然后运行,必须一步一步来并且不要进行窗口操作对连接Mycat的那个连接,因为会报错 #第一步:删表USE `STOREDB`;DROP TABLE IF EXISTS `TB_USERS`;#第二步:建表CREATE TABLE `TB_USERS` ( `id` bigint(20) NOT NULL, `username` varchar(20) NOT NULL, `password` varchar(20) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;#第三步:插入数据insert into `TB_USERS`(`id`,`username`,`password`) values (1,'zhangsan1','123456');insert into `TB_USERS`(`id`,`username`,`password`) values (2,'zhangsan2','123456');insert into `TB_USERS`(`id`,`username`,`password`) values (3,'zhangsan3','123456');insert into `TB_USERS`(`id`,`username`,`password`) values (5000001,'lisi1','123456');insert into `TB_USERS`(`id`,`username`,`password`) values (5000002,'lisi2','123456');insert into `TB_USERS`(`id`,`username`,`password`) values (5000003,'lisi3','123456');insert into `TB_USERS`(`id`,`username`,`password`) values (10000001,'wangwu1','123456');insert into `TB_USERS`(`id`,`username`,`password`) values (10000002,'wangwu2','123456');insert into `TB_USERS`(`id`,`username`,`password`) values (10000003,'wangwu3','123456');
创建订单表,然后插入数据,直接拷贝以下SQL代码到窗口,然后运行,必须一步一步来并且不要进行窗口操作对连接Mycat的那个连接,因为会报错
13.10、Mycat的效果重开一个窗口,连接主节点,依次查看,db1、db2、db3上的TB_USERS、TB_ORDER,你会发现数据是均匀分布的,这就实现了我们最终的分片集群了,具体效果图如下: db1>TB_USERS db2>TB_USERS db3>TB_USERS db1>TB_ORDER db2>TB_ORDER db3>TB_ORDER 13.11、Mycat的踩坑
|
|