MYSQL部分知识点代码参考
一、MYSQL约束
提示:以下是本篇文章正文内容,下面案例可供参考
create database mybd;
USE mybd;
CREATE TABLE IF NOT EXISTS stt(
sid INT PRIMARY KEY AUTO_INCREMENT, -- 主键约束 后面是自增长约束 两者一起使用
NAME VARCHAR(20) NOT NULL, -- 非空约束
age INT ZEROFILL, -- 零填充约束 自动变为无符号,数值范围变大
address VARCHAR(20) DEFAULT '北京', -- 默认约束
dir VARCHAR(20) UNIQUE -- 唯一约束
-- primary key(sid,name) 联合主键
)AUTO_INCREMENT = 100;
ALTER TABLE stt DROP bir;
ALTER TABLE stt ADD bir INT;
ALTER TABLE stt ADD PRIMARY KEY( sid); -- 增加主键约束
ALTER TABLE stt DROP PRIMARY KEY(sid); -- 删除主键约束
ALTER TABLE stt AUTO_INCREMENT = 100; -- 设定自增长初始值 不设定则默认从1开始
ALTER TABLE stt MODIFY NAME VARCHAR(20) NOT NULL; -- 增加非空约束
ALTER TABLE stt MODIFY NAME VARCHAR(20); -- 删除非空约束
ALTER TABLE stt MODIFY age INT; -- 删除零填充约束
ALTER TABLE stt ADD CONSTRAINT 约束名 UNIQUE(NAME); -- 增加唯一约束 约束名随便写
ALTER TABLE stt DROP INDEX 约束名; -- 删除唯一约束 要是在创建表上直接创建,约束名就是用约束的列名
ALTER TABLE stt MODIFY address VARCHAR(20) DEFAULT '北京'; -- 增加默认约束
ALTER TABLE stt MODIFY address VARCHAR(20) DEFAULT NULL; -- 删除默认约束
INSERT INTO stt VALUES (1,'shjask',1,'3');
INSERT INTO stt(sid,NAME,age,dir) VALUES (1,'shjask',1,'3'),(2,'shjask',3,'4');
delete from stt;
truncate stt;
desc stt;
二、MYSQL数据库基本操作
USE mybd;
CREATE TABLE IF NOT EXISTS product(
pid INT PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20) NOT NULL,
price DOUBLE,
category_id VARCHAR(20)
);
INSERT INTO product VALUES(NULL,'海尔',5000,'c001');
INSERT INTO product VALUES(NULL,'美的',3000,'c001');
INSERT INTO product VALUES(NULL,'衬衣',300,'c002');
INSERT INTO product VALUES(NULL,'西裤',800,'c002');
INSERT INTO product VALUES(NULL,'面霜',300,'c003');
INSERT INTO product VALUES(NULL,'精华水',200,'c003');
INSERT INTO product VALUES(NULL,'坚果',88,NULL);
SELECT * FROM product; -- 查询所有信息,*代表所有列
SELECT DISTINCT price FROM product; -- 删除 price 重复值
SELECT panme,price+10 AS new_price FROM product;-- 查询结果为表达式(例如所有price+10)as后面跟的是别名,as可省略
SELECT * FROM product WHERE price = 300; -- 不等于!= 或者<>
SELECT * FROM product WHERE price BETWEEN 200 AND 1000; -- 查询价格200到1000的商品
SELECT * FROM product WHERE price IN(300,1000); -- 查询价格为300或1000的商品
SELECT * FROM product WHERE pname LIKE '%裤'; -- %用于匹配任意字符,_用于匹配单个字符
SELECT * FROM product WHERE pname LIKE '_华%';
SELECT * FROM product WHERE pname REGEXP '^海'; -- ^海 代表以海开头的 在字符串开头匹配
SELECT * FROM product WHERE pname REGEXP '面$'; -- 在字符串末尾匹配
SELECT * FROM product WHERE pname REGEXP '面.'; -- 任意单个字符
SELECT * FROM product WHERE category_id is null; -- 查询内容是否为null
SELECT * FROM product WHERE category_id is not null; -- 查询内容是否不是null
select * from product order by price; -- 默认是升序(asc),降序是desc 改题是根据price进行排序
select * from product order by price desc,category_id desc; -- 在第一个条件的基础上,进行第二个条件的排序
select count(*) from product; -- 查询商品总条数,不计算null
select sum(price) sum_price from product where category_id='c001'; -- 计算c001商品价格的总和
select avg(price) from product; -- 计算平均值
select max(price) max_price, min(price) min_price from product;
select count(category_id) from product group by category_id; -- 根据category_id数组是否相同进行分组 ,并统计个数
select category_id,count(pid) cut from product group by category_id having cut>1; -- having是对group by进行筛选,where是对from进行筛选
select * from product limit 5; -- 查询product前五条消息
select * from product limit 3,5; -- 从第四条开始显示,显示五条
insert into table2 select * from table1; -- 将table1的数据导入table2中,二者接收数据类似必须一致且table2必须存在
ifnull(category_id,0) 是如果category_id的值是null,则当场0
三、多表操作
USE mybd;
CREATE TABLE IF NOT EXISTS dept(
detpno VARCHAR(20) PRIMARY KEY,
NAME VARCHAR(20)
);
CREATE TABLE IF NOT EXISTS emp(
eid VARCHAR(20) PRIMARY KEY,
ename VARCHAR(20),
age INT,
dept_id VARCHAR(20), -- 员工所属部门
CONSTRAINT emp_fk FOREIGN KEY (dept_id) REFERENCES dept (detpno) -- emp_fk是外键名字,可以随便起
-- ^给哪一列设置外键 ^主表名和主键列
);
INSERT INTO dept VALUES('1001','研发部'),('1002','人事部'),('1003','销售部');
INSERT INTO emp VALUES('1','rhg',20,'1001');
INSERT INTO emp VALUES('2','zyf',20,'1002');
INSERT INTO emp VALUES('3','yym',19,'1002');
DELETE FROM dept WHERE detpno = '1001'; -- 不可以被删除,主表的数据被依赖时不能被删除
DELETE FROM dept WHERE detpno = '1003'; -- 可以被删除
DELETE FROM emp WHERE eid = '2'; -- 可以被删除,从表随便删
ALTER TABLE emp DROP FOREIGN KEY emp_fk; -- 删除外键
ALTER TABLE emp ADD CONSTRAINT emp_fk FOREIGN KEY (dept_id) REFERENCES dept (detpno); -- 添加外键
SELECT * FROM emp WHERE age = (SELECT MAX(age) FROM emp); -- 子查询 查询年龄最大的
SELECT * FROM dept d JOIN emp e ON e.dept_id = d.detpno AND(NAME = '研发部' OR NAME = '人事部'); -- 关联查询
SELECT * FROM emp WHERE age > ALL(SELECT age FROM emp WHERE dept_id = '1001'); -- all 的用法举例
SELECT * FROM emp WHERE age > ANY(SELECT age FROM emp WHERE dept_id = '1001'); -- any 的用法举例,和some相同
SELECT * FROM emp e WHERE EXISTS(SELECT age FROM emp WHERE e.dept_id = '1001'); -- exists 的用法举例,存在则返回ture,外层查询执行 括号里面必须是查询语句
SELECT * FROM emp WHERE EXISTS(SELECT 1); -- 全表输出
SELECT GROUP_CONCAT(ename ORDER BY age SEPARATOR ';') FROM emp GROUP BY dept_id; -- group_concat使数据合并成一行,separator表示分隔符
四、各种函数(日期、数学、字符串)
SELECT ABS(-456); -- 表示绝对值
SELECT CEIL(56.1); -- 表示向上取整
SELECT FLOOR(56.9); -- 表示向下取整
SELECT GREATEST(1,2.3,5); -- 表示取列表最大值
SELECT LEAST(1,2.3,5); -- 表示取列表最小值
SELECT MOD(5,2); -- 表示取模,5除以2的余数
SELECT POW(2,2); -- 返回2的2次方
SELECT RAND(); -- 返回0到1的随机数
SELECT ROUND(1.2555); -- 四舍五入
SELECT ROUND(1.2555,3); -- 四舍五入,保留3位小数
SELECT TRUNCATE(1.2555,3); -- 不进行四舍五入,只保留3位小数
SELECT CHAR_LENGTH('Geass'); -- 返回字符的个数,是字节,一个汉字在utf—8里面是三个字节
SELECT CONCAT('Gode','Geass'); -- 将字符串合并,无间隔符
SELECT CONCAT_WS('-','Gode','Geass'); -- 将字符串合并,间隔符是第一个设定的字符
SELECT FIELD('c','a','b','c'); -- 返回第一个字符在列表中第一次出现的位置
SELECT LTRIM(' cc'); -- 去除字符串左边的空格
SELECT RTRIM('cc a'); -- 去除字符串右边的空格
SELECT TRIM(' cca '); -- 去除字符串两端的空格
SELECT MID('hello',2,3); -- 从第2个字节开始截取字符串,截取3个
SELECT POSITION('abc' IN 'hello abc'); -- 获取字符串c在字符串abc中的位置
SELECT REPLACE('abc','a','z'); -- 将字符串abc的字符a替换成z
SELECT REVERSE('abcd'); -- 将字符串顺序反过来
SELECT RIGHT('MYSQL',3); -- 返回字符串后三个字符
SELECT STRCMP('hello','world'); -- 字符串比较,比较在字典里面的位置
SELECT SUBSTR('hello',2,3); -- 字符 串截取,从第二个字符开始,截取三个(substring也可以)
SELECT UPPER('hello world'); -- 将小写转换为大写(ucase也可以)
SELECT LOWER('HELLO WORLD'); -- 将大写转换为小写(lcase也可以)
-- 日期函数
SELECT UNIX_TIMESTAMP(); -- 获得时间串,毫秒级
SELECT FROM_UNIXTIME(1645363457,'%Y-%m-%d %H:%i:%s'); -- 将时间串毫秒值转化为指定格式的日期
SELECT CURDATE(); -- 获取当前年月日(current_date也可以)
SELECT CURTIME(); -- 获取当前时分秒(current_time也可以)
SELECT CURRENT_TIMESTAMP(); -- 获取当前日期和时间
SELECT NOW(); -- 同上
SELECT DATE('2022-02-20 21:47:19'); -- 获取日期字符串中的年月日
SELECT DATEDIFF('2022-02-20','2020-08-23'); -- 获取日期之间的差值
SELECT TIMEDIFF('21:47:19',CURTIME()); -- 获取时间的差值
SELECT DATE_FORMAT('2022-02-20 1:7:9','%Y-%m-%d %r %H:%i:%s'); -- 日期格式化
SELECT STR_TO_DATE('August 10 2017','%M%d%Y'); -- 将字符串转变为日期
SELECT DATE_SUB('2022-2-22',INTERVAL 2 DAY); -- 将日期作减法
SELECT DATE_ADD('2022-2-22',INTERVAL 11 DAY); -- 将日期作加法
SELECT EXTRACT(MINUTE FROM '2022-02-22 22:23:22'); -- 获取日期中设定的值,minute是分钟
SELECT LAST_DAY('2022-2-22'); -- 获取给定日期的最后一天
SELECT MAKEDATE('2022',53); -- 获取指定年份和天数的日期,2022年的第53天是几号
-- 根据日期获取相应信息
SELECT YEAR('2022-2-22');
SELECT MONTH('2022-2-22');
SELECT MINUTE('2022-2-22');
SELECT WEEK('2022-2-22');
SELECT QUARTER('2022-2-22'); -- 获取季度
SELECT MONTHNAME('2022-2-22'); -- 获取月的英文名
SELECT DAYNAME('2022-2-22'); -- 获取星期的英文名
SELECT DAYOFWEEK('2022-2-22'); -- 获取星期几(1是星期日,2是星期一)
SELECT DAYOFYEAR('2022-2-22'); -- 获取该天是该年的第几天
SELECT IF(1<0,'yes','no yes');
SELECT IFNULL(NULL,'no'); -- 判断v1是否为null,是则返回null,不是则返回v2
SELECT ISNULL(NULL); -- 判断内容是否为null,是返回1,不是返回0
SELECT NULLIF(25,25); -- 如果expr1与expr相等,返回null,否则返回expr1
五、MYSQL排序、分组操作
USE mybd;
CREATE TABLE employee(
dname VARCHAR(20),
eid VARCHAR(20),
ename VARCHAR(20),
hiredate DATE,
salary DOUBLE
);
INSERT INTO employee VALUES('研发部','1001','张飞','2022-02-03',3000);
INSERT INTO employee VALUES('研发部','1001','赵云','2022-02-04',3500);
INSERT INTO employee VALUES('研发部','1001','马超','2022-02-03',7200);
INSERT INTO employee VALUES('研发部','1001','黄忠','2022-02-05',5600);
INSERT INTO employee VALUES('研发部','1001','关羽','2022-02-06',4500);
INSERT INTO employee VALUES('研发部','1001','关平','2022-02-06',4500);
INSERT INTO employee VALUES('销售部','1002','曹操','2022-02-16',8500);
INSERT INTO employee VALUES('销售部','1002','张辽','2022-02-17',8500);
INSERT INTO employee VALUES('销售部','1002','典韦','2022-02-17',6500);
INSERT INTO employee VALUES('销售部','1002','许褚','2022-02-18',5500);
INSERT INTO employee VALUES('销售部','1002','徐晃','2022-02-18',5500);
-- 三种方法排序
SELECT dname,ename,salary,
row_number() over(PARTITION BY dname ORDER BY salary DESC) rn_row,
rank() over(PARTITION BY dname ORDER BY salary DESC) rn_rank,
dense_rank() over(PARTITION BY dname ORDER BY salary DESC) rn_dense
FROM employee;
-- 求薪资排名前三的员工
SELECT * FROM(
SELECT dname,ename,salary,
rank() over(PARTITION BY dname ORDER BY salary DESC) rn
FROM employee
)t
WHERE t.rn <=3;
-- 对所有员工进行排序
SELECT dname,ename,salary, rank() over(ORDER BY salary DESC) rn FROM employee;
-- 对员工工资进行相加
SELECT dname,ename,salary, SUM(salary) over(PARTITION BY dname ) SUM FROM employee;
SELECT dname,ename,salary, cume_dist() over(PARTITION BY dname ORDER BY salary DESC) cd FROM employee; -- cume_dist():分组内小于等于当前值的行数除以总行数
SELECT dname,ename,salary, cume_dist() over(ORDER BY salary DESC) cd FROM employee; -- 不加partition by 则所有分组的内容合并成一个大组
SELECT
dname,ename,salary,hiredate,
lag(hiredate,1,'2001-1-1') over(PARTITION BY dname ORDER BY hiredate) time1,
lag(hiredate,2) over(PARTITION BY dname ORDER BY hiredate) time2
FROM employee; -- lag是返回当前行的前n行的expr的值,lag()填写的第三个值是默认值,不填写的话默认是0。lead是返回当前行的后n行的expr的值
SELECT
dname,ename,salary,hiredate,
lead(hiredate,1,'2001-1-1') over(PARTITION BY dname ORDER BY hiredate) time1,
lead(hiredate,2) over(PARTITION BY dname ORDER BY hiredate) time2
FROM employee; -- lead是返回当前行的后n行的expr的值,注意点与lag相同
-- 查询第一个和最后一个入职人的薪资
SELECT
dname,ename,salary,hiredate,
first_value(salary) over(PARTITION BY dname ORDER BY hiredate) frist,
last_value(salary) over(PARTITION BY dname ORDER BY hiredate) LAST
FROM employee; -- 返回第一个或最后一个expr的值
-- 查询特定位置的信息
SELECT
dname,ename,salary,hiredate,
nth_value(salary,2) over(PARTITION BY dname ORDER BY hiredate) second_score,
nth_value(salary,3) over(PARTITION BY dname ORDER BY hiredate) third_score
FROM employee; -- 返回当前窗口第n个的expr的值
-- 将每门员工按照入职日期分组
SELECT
dname,ename,salary,hiredate,
ntile(3) over(PARTITION BY dname ORDER BY hiredate) nti
FROM employee; -- 将分区的有序数据分成n个等级,记录等级数
六、MYQSL视图和存储过程
此模块使用的表为emp,创建在模块三种
USE mybd;
CREATE OR REPLACE VIEW view1 AS SELECT eid,ename,age FROM emp; -- 创建视图
SHOW FULL TABLES; -- 查看表和视图
SELECT * FROM view1;
-- 修改视图
ALTER VIEW view1 AS SELECT eid,ename,age,dept_id FROM emp;
-- 重命名视图
RENAME TABLE view1 TO my_view;
-- 删除视图,只能删除视图的定义,不能删除数据
DROP VIEW IF EXISTS my_view ;
-- 创建存储过程
DELIMITER $ -- $ 可以换成任意符号
CREATE PROCEDURE proc01()
BEGIN
SELECT eid,ename,age,dept_id FROM emp;
END $ -- $ 该符号应该与上面的相同
DELIMITER ;
-- 调用存储过程
CALL proc01;
-- 定义变量
DELIMITER $$
CREATE PROCEDURE proc02 ()
BEGIN
DECLARE my_name VARCHAR (20) ; -- 定义局部变量
SELECT ename INTO my_name FROM emp WHERE dept_id = 1001 ; -- 给变量赋值
SELECT my_name ; -- 输出变量的值
END $$
DELIMITER ;
CALL proc02 ;
-- 用户变量
DELIMITER $$
CREATE PROCEDURE proc03()
BEGIN
SET @var_name01 = 'beijing'; -- 加了@是用户变量,出了存储过程也可以使用
SELECT @var_name01;
END $$
DELIMITER ;
CALL proc03() ;
SELECT @var_name01; -- 也可以使用用户变量
-- 查看全局变量,查看某个全局变量是select @@global.需要查询的变量名。修改是set global.需要查询的变量名= ;
SHOW GLOBAL VARIABLES;
-- 查看会话变量,操作与全局变量类似
SHOW SESSION VARIABLES;
-- 传入参数in
DELIMITER $$
CREATE PROCEDURE proc04(IN peid VARCHAR(20))
BEGIN
SELECT * FROM emp WHERE eid = peid;
END $$
DELIMITER ;
CALL proc04('1');
-- 传出参数out
DELIMITER $$
CREATE PROCEDURE proc05(IN peid VARCHAR(20),OUT out_name VARCHAR(20))
BEGIN
SELECT ename INTO out_name FROM emp WHERE eid = peid; -- into是将ename的值赋予给out_name
END $$
DELIMITER ;
CALL proc05('1',@ename); -- 利用用户变量来接受返回的值
SELECT @ename;
-- 传参inout
DELIMITER $$
CREATE PROCEDURE proc06(INOUT num INT)
BEGIN
SET num = num * 10;
END $$
DELIMITER ;
SET @inout_num = 2; -- 要设置用户变量
CALL proc06(@inout_num);
SELECT @inout_num;
-- if
DELIMITER $$
CREATE PROCEDURE proc07 (IN score INT)
BEGIN
IF score < 60
THEN
SELECT
'不及格' ;
ELSEIF score >= 60 AND score < 80
THEN
SELECT
'及格' ;
ELSEIF score >= 80 AND score < 90
THEN
SELECT
'良好' ;
ELSEIF score >= 90 AND score <= 100
THEN
SELECT
'优秀' ;
ELSE
SELECT
'成绩错误' ;
END IF ;
END $$
DELIMITER ;
CALL proc07(90);
-- switch
DELIMITER $$
CREATE PROCEDURE proc08(IN pay INT)
BEGIN
CASE pay
WHEN 1 THEN SELECT '微信支付';
WHEN 2 THEN SELECT '支付宝支付';
WHEN 3 THEN SELECT '银行卡支付';
ELSE SELECT '其他方式支付';
END CASE;
END $$
DELIMITER ;
CALL proc08(2);
七、MYSQL游标、函数
USE mybd;
CREATE TABLE USER (
uid INT PRIMARY KEY,
uname VARCHAR(20),
PASSWORD VARCHAR(20)
);
DELIMITER $$
CREATE PROCEDURE proc09(IN ic INT)
BEGIN
DECLARE i INT DEFAULT 1; -- declare是要定义局部变量,default是要使用的默认值
label:WHILE i<=ic DO
INSERT INTO USER VALUES(i,CONCAT('user-',i),'123456');
IF i = 5 THEN
LEAVE label; -- leave相当于break,而iterate相当于continue
END IF;
SET i = i+1;
END WHILE label; -- label是标签,可以去掉
SELECT '循环结束';
END$$
DELIMITER ;
CALL proc09(6);
TRUNCATE TABLE USER;
-- repeat 相当与do while
DELIMITER $$
CREATE PROCEDURE proc10 (IN ic INT)
BEGIN
DECLARE i INT DEFAULT 1 ;
label:REPEAT
INSERT INTO USER VALUES(i, CONCAT('user-', i), '123456') ;
SET i = i + 1 ;
UNTIL i > ic -- 当满足成功条件时退出循环
END REPEAT label ;
SELECT '循环结束';
END $$
DELIMITER ;
CALL proc10(10);
-- loop
DELIMITER $$
CREATE PROCEDURE proc11_loop (IN ic INT)
BEGIN
DECLARE i INT DEFAULT 1 ;
label:LOOP
INSERT INTO USER VALUES(i, CONCAT('user-', i), '123456') ;
SET i = i + 1 ;
IF i > ic
THEN
LEAVE lable;
END IF;
UNTIL i > ic -- 当满足成功条件时退出循环
END LOOP label ;
SELECT '循环结束';
END $$
DELIMITER ;
-- 游标
-- 声明游标
DECLARE [游标名字] CURSOR FOR select_statement;
-- 打开语法
OPEN [游标名字];
-- 取值语法
FETCH [游标名字] INTO .....;
-- 关闭语法
CLOSE [游标名字];
-- 创建函数
DROP FUNCTION IF EXISTS myfunc_emp;
-- 创建函数之前先要允许创建函数权限信任
SET GLOBAL log_bin_trust_function_creators = TRUE;
DELIMITER $$
CREATE FUNCTION myfunc_emp(in_eid INT) RETURNS VARCHAR(20)
BEGIN
DECLARE out_ename VARCHAR(20);
SELECT ename INTO out_ename FROM emp WHERE eid = in_eid;
RETURN out_ename;
END $$
DELIMITER ;
-- 调用函数
SELECT myfunc_emp(1);
八、MYSQL触发器、事务
CREATE DATABASE IF NOT EXISTS mybd2;
USE mybd2;
CREATE TABLE USER(
uid INT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
PASSWORD VARCHAR(50) NOT NULL
);
CREATE TABLE user_logs(
id INT PRIMARY KEY AUTO_INCREMENT,
TIME TIMESTAMP,
log_text VARCHAR(255)
);
-- 查看触发器
SHOW TRIGGERS;
-- 删除触发器
DROP TRIGGER IF EXISTS trigger_text2;
-- 执行一条语句的写法(insert)
CREATE TRIGGER trigger_text1 AFTER INSERT -- 添加insert触发器 还可以添加drop和update
ON USER FOR EACH ROW
INSERT INTO user_logs VALUES(NULL,NOW(),CONCAT('有新用户添加,信息为:',new.uid,new.username,new.password));
INSERT INTO USER VALUES(2,'zyf','123456');
-- 执行多条语句的写法(update)
DELIMITER $$
CREATE TRIGGER trigger_text2 BEFORE UPDATE
ON USER FOR EACH ROW
BEGIN
INSERT INTO user_logs VALUES(NULL,NOW(),CONCAT('有用户信息被修改,修改之前信息为:',old.uid,old.username,old.password));
END $$
DELIMITER ;
UPDATE USER SET PASSWORD = '899999' WHERE uid = 2;
-- 执行多条语句的写法(delete)
DELIMITER $$
CREATE TRIGGER trigger_text3 BEFORE DELETE
ON USER FOR EACH ROW
BEGIN
INSERT INTO user_logs VALUES(NULL,NOW(),CONCAT('有用户信息被删除,删除用户信息为:',old.uid,old.username,old.password));
END $$
DELIMITER ;
DELETE FROM USER WHERE uid = 2;
SELECT @@autocommit; -- 默认为1
-- 设置mysql事务为手动提交(关闭自动提交)
SET autocommit = 0;
SET autocommit = 1; -- 用完之后记得重新设置回1
-- 开启事务
BEGIN;
UPDATE employee SET salary = salary - 500 WHERE ename='张飞';
UPDATE employee SET salary = salary + 500 WHERE ename='赵云';
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
SELECT * FROM employee;
作者个人小总结
MYSQL学习也是在漫长的程序员道路上的一个路标,在学习并且熟知完以上的代码后,mysql的基本使用可以说是
掌握一些的。这些知识点记起来倒不困难,难的是隔一段时间之后使用起来的掌握程度。就像是学习一样,两天不学
就不爱学了;两周不学就全忘了一样。不是条轻松路。【搞得好像哪条路好走一样....】。
好好学吧小伙子们
以上