[数据库-Mongo总结]-mysql使用总结和pymysql交互

3. MySQL
3.1 安装
3.1.1 win
3.1.1.1 安装
>下载mysql
>mysql-front:
Host:localhost
端口:3306
用户:root
3.1.2 linux
3.1.2.1 安装
>sudo apt-get install mysql-server mysql-client
>输入密码
3.1.2.2 连接
>mysql -uroot -p
>show databases;
>use database_name;
>select * from db;
3.1.2.3 修改配置
>cd /etc/mysql/
>cd mysql.conf.d/
>vi mysqld.cnf > bind adress注释掉
>sudo service mysql restart
3.1.3 mac
3.1.3.1 安装
brew install mysql
3.1.3.2 连接
>mysql -uroot -p(c1c1c1)
>show databases;
3.2设置密码
>mysqladmin -uroot password "123" #设置初始密码
>mysqladmin -uroot -p原密码 password "新密码" #修改用户密码

3.3登录
>mysql #本地登录,默认用户root,空密码,用户为root@127.0.0.1
>mysql -uroot -p1234 #本地登录,指定用户名和密码,用户为root@127.0.0.1
>mysql -uroot -p1234 -h 192.168.31.95 #远程登录,用户为root@192.168.31.95
>mysql -h服务器IP -P端口号 -u用户名 --prompt命令提示符 --delemiter指定分隔符
> mysql -h127.0.0.1 -P3306 -uroot -p666666

3.4启动
3.4.1 mac
>启动 sudo /usr/local/mysql/support-files/mysql.server start
>重启 sudo /usr/local/mysql/support-files/mysql.server restart
>停止 sudo /usr/local/mysql/support-files/mysql.server stop
3.4.2 linux
>service mysqld start #开启
>chkconfig mysqld on / systemctl start mariadb #设置开机自启

3.5忘记密码
3.5.1 mac
>step1:苹果->系统偏好设置->最下边点mysql 在弹出页面中 关闭mysql服务(点击stop mysql server)
>step2:
>进入终端输入:cd /usr/local/mysql/bin/
>回车后 登录管理员权限 sudo su
>回车后输入以下命令来禁止mysql验证功能 ./mysqld_safe --skip-grant-tables &
>回车后mysql会自动重启(偏好设置中mysql的状态会变成running)
>step3:
>输入命令 ./mysql
>回车后,输入命令 FLUSH PRIVILEGES;
>回车后,输入命令 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('你的新密码');


3.6 sql规范
>不区分大小写,但是命令尽量用大写,自定义的用小写。
>以;为结束
>可以折行


3.7 DDL DML DCL
>创建数据库
>create database if not exists database_name;
>create database if not exists database_name character set gbk;
默认编码为utf-8
>查看数据库 show databases;
>查看当前数据库 select database();
>修改数据库 alter dastabase db_name;
>alter dastabase db_name character set utf8;
>删除数据库 drop database if exists db_name;
>查看警错误信息 show warnings;
>查看创建表信息 show create database s;
>退出数据库:use new_database;

3.8 数据类型 参考网址 https://www.cnblogs.com/yuanchenqi/articles/6357507.html
>主键:非空且唯一 not null unique
>数字类型
>tinyint 1b (-128,127) (0,255)
>smallint 2b (-32768, 32767) (0,65535)
>mediumint 3b (-8388608, 8388607) (0, 16777215)
>int 4b
>bigint
>float
>double
>decimal
>字符串类型
>char 0-255b 定长字符串
>varchar 0-65535b 变长字符串
>tinyblob 0-255b 二进制字符串
>tinytext
>blob 0-65535b 二进制长字符串
>text 0- 65535b 长文本
>mediumblob
>mediumtext 0-167 77215b 中等长度文本数据
>longblob
>longtext 0- 4294967295b 极大文本数据
>时间类型
>date YYYY-MM-DD
>time HH:MM:SS
>year YYYY
>datetime YYYY-MM-DD HH:MM:SS
>timestamp YYYYMMDD HHMMSS

3.9 数据表操作
3.9.1 查看表
desc tab_name 查看表结构
show columns from tab_name 查看表结构
show tables 查看当前数据库中的所有的表
show create table tab_name 查看当前数据库表建表语句

3.9.2建表:
>CREATE TABLE employee( id TINYINT PRIMARY KEY auto_increment, name VARCHAR(25), gender boolean, age INT, department VARCHAR(20), salary DOUBLE(7,2) );

3.9.3 修改表
3.9.3.1增加列(字段)
>alter table tab_name add [column] 列名 类型[完整性约束条件][first|after 字段名];
>alter table user add addr varchar(20) not null unique first/after username;
>#添加多个字段
>alter table users2
add addr varchar(20),
add age int first,
add birth varchar(20) after name;
3.9.3.2修改一列类型
>alter table tab_name modify 列名 类型 [完整性约束条件][first|after 字段名];
>alter table users2 modify age tinyint default 20;
>alter table users2 modify age int after id;

3.9.3.3修改列名
>alter table tab_name change [column] 列名 新列名 类型 [完整性约束条件][first|after 字段名];
>alter table users2 change age Age int default 28 first;

3.9.3.4删除一列
>alter table tab_name drop [column] 列名;
思考:删除多列呢?删一个填一个呢?
>alter table users2
add salary float(6,2) unsigned not null after name,
drop addr;

3.9.3.5修改表名
>rename table 表名 to 新表名;

3.9.3.6修该表所用的字符集
>alter table student character set utf8;

3.9.3.7删除表
drop table tab_name;

3.9.3.8 添加主键,删除主键
>alter table tab_name add primary key(字段名称,...)
>alter table users drop primary key;


3.9.4 增加
3.9.4.1 增加一条记录insert
>/*insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......);*/
3.9.4.2 插入多条数据
>insert into employee_new values
(4,'alvin1','1993-04-20',3000),
(5,'alvin2','1995-05-12',5000);
3.9.4.3 set插入
>insert [into] tab_name set 字段名=值
>insert into employee_new set id=12,name="alvin3";


3.9.5 修改
3.9.5.1修改表记录
>update tab_name set field1=value1,field2=value2,......[where 语句]
/*UPDATE语法可以用新值更新原有表行中的各列。
SET子句指示要修改哪些列和要给予哪些值。
WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。*/
>update employee_new set birthday="1989-10-24" WHERE id=1;

>将yuan的薪水在原有基础上增加1000元。
update employee_new set salary=salary+4000 where name='yuan';

3.9.6 删除

3.9.6.1 删除表记录
>delete from tab_name [where ....]
/*如果不跟where语句则删除整张表中的数据
delete只能用来删除一行记录
delete语句只能删除表中的内容,不能删除表本身,想要删除表,用drop
TRUNCATE TABLE也可以删除表中的所有数据,词语句首先摧毁表,再新建表。此种方式删除的数据不能在事务中恢复。*/

>删除表中名称为’alex’的记录。
delete from employee_new where name='alex';

>删除表中所有记录。
delete from employee_new;
>注意auto_increment没有被重置:
>alter table employee auto_increment=1;

>使用truncate删除表中记录。
truncate table emp_new;
>truncate 和 delete 的区别:
>delete:将表中数据一条一条的删除
>truncate:将整张表删除,再重新创建一张表名一样的表
3.9.7 查询 顺序
SELECT *|field1,filed2 ... FROM tab_name
WHERE 条件
GROUP BY field
HAVING 筛选
ORDER BY field
LIMIT 限制条数

3.9.7.1 select .. from ..
> 查询表中所有学生的信息。
select * from ExamResult;
>查询表中所有学生的姓名和对应的英语成绩。
select name,JS from ExamResult;
>过滤表中重复数据。
select distinct JS ,name from ExamResult;
select distinct * from ..;
3.9.7.2 select ..as....from
>select 也可以使用表达式,并且可以使用: 字段 as 别名或者:字段 别名
>在所有学生分数上加10分特长分显示。
select name,JS+10,Django+10,OpenStack+10 from ExamResult;
>统计每个学生的总分。
select name,JS+Django+OpenStack from ExamResult;
>使用别名表示学生总分。
select name as 姓名,JS+Django+OpenStack as 总成绩 from ExamResult;
select name,JS+Django+OpenStack 总成绩 from ExamResult;
select name JS from ExamResult; -- what will happen?---->记得加逗号

3.9.7.3使用where子句,进行过滤查询。
>查询姓名为XXX的学生成绩
select * from ExamResult where name='yuan';
>查询英语成绩大于90分的同学
select id,name,JS from ExamResult where JS>90;
>查询总分大于200分的所有同学
select name,JS+Django+OpenStack as 总成绩 from
ExamResult where JS+Django+OpenStack>200 ;
>where字句中可以使用:
>比较运算符:
> < >= <= <> !=
between 80 and 100 值在10到20之间
in(80,90,100) 值是10或20或30
like 'yuan%'
/*
pattern可以是%或者_,
如果是%则表示任意多字符,此例如唐僧,唐国强
如果是_则表示一个字符唐_,只有唐僧符合。两个_则表示两个字符:__
*/

>逻辑运算符
在多个条件直接可以使用逻辑运算符 and or not
>练习
>查询JS分数在 70-100之间的同学。
select name ,JS from ExamResult where JS between 80 and 100;
>查询Django分数为75,76,77的同学。
select name ,Django from ExamResult where Django in (75,98,77);
>查询所有姓王的学生成绩。--匹配多个
select * from ExamResult where name like '王%';
--查询名字为王开头,两个字 --匹配一个
select * from er where name like "王_";
>查询JS分>90,Django分>90的同学。
select id,name from ExamResult where JS>90 and Django >90;
>查找缺考数学的学生的姓名
select name from ExamResult where Database is null;
3.9.7.4 order by
>指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的别名。
>select *|field1,field2... from tab_name order by field [Asc|Desc]

>Asc 升序、Desc 降序,其中asc为默认值 ORDER BY 子句应位于SELECT语句的结尾。
>练习:

>对JS成绩排序后输出。
select * from ExamResult order by JS;

>对总分排序按从高到低的顺序输出
select name ,(ifnull(JS,0)+ifnull(Django,0)+ifnull(Database,0))
总成绩 from ExamResult order by 总成绩 desc;

>对姓李的学生成绩排序输出
select name ,(ifnull(JS,0)+ifnull(Django,0)+ifnull(OpenStack,0))
总成绩 from ExamResult where name like 'a%'
order by 总成绩 desc;
3.9.7.5 group by
>group by 分组查询:
CREATE TABLE order_menu(
id INT PRIMARY KEY auto_increment,
product_name VARCHAR (20),
price FLOAT(6,2),
born_date DATE,
class VARCHAR (20)
);
INSERT INTO order_menu (product_name,price,born_date,class) VALUES
("苹果",20,20170612,"水果"),
("香蕉",80,20170602,"水果"),
("水壶",120,20170612,"电器"),
("被罩",70,20170612,"床上用品"),
("音响",420,20170612,"电器"),
("床单",55,20170612,"床上用品"),
("草莓",34,20170612,"水果");
>注意,按分组条件分组后每一组只会显示第一条记录

>group by字句,其后可以接多个列名,也可以跟having子句,对group by 的结果进行筛选。
>按位置字段筛选
select * from order_menu group by 5;

>练习:对购物表按类名分组后显示每一组商品的价格总和
select class,SUM(price)from order_menu group by class;

>练习:对购物表按类名分组后显示每一组商品价格总和超过150的商品
select class,SUM(price)from order_menu group by class HAVING SUM(price)>150;
/*
having 和 where两者都可以对查询结果进行进一步的过滤,差别有:
<1>where语句只能用在分组之前的筛选,having可以用在分组之后的筛选;
<2>使用where语句的地方都可以用having进行替换
<3>having中可以用聚合函数,where中就不行。
*/
3.9.7.6 聚合函数:
>先不要管聚合函数要干嘛,先把要求的内容查出来再包上聚合函数即可。(一般和分组查询配合使用)
>统计表中所有记录
>COUNT(列名):统计行的个数
>统计一个班级共有多少学生?先查出所有的学生,再用count包上
select count(*) from ExamResult;
>统计JS成绩大于70的学生有多少个?
select count(JS) from ExamResult where JS>70;
>统计总分大于280的人数有多少?
select count(name) from ExamResult
where (ifnull(JS,0)+ifnull(Django,0)+ifnull(OpenStack,0))>280;
>注意:count(*)统计所有行; count(字段)不统计null值.

>SUM(列名):统计满足条件的行的内容和
>统计一个班级JS总成绩?先查出所有的JS成绩,再用sum包上
select JS as JS总成绩 from ExamResult;
select sum(JS) as JS总成绩 from ExamResult;
>统计一个班级各科分别的总成绩
select sum(JS) as JS总成绩,
sum(Django) as Django总成绩,
sum(OpenStack) as OpenStack from ExamResult;

>统计一个班级各科的成绩总和
select sum(ifnull(JS,0)+ifnull(Django,0)+ifnull(Database,0)) as 总成绩 from ExamResult;
>统计一个班级JS成绩平均分
select sum(JS)/count(*) from ExamResult ;
>注意:sum仅对数值起作用,否则会报错。

>AVG(列名):
>求一个班级JS平均分?先查出所有的JS分,然后用avg包上。
select avg(ifnull(JS,0)) from ExamResult;
>求一个班级总分平均分select avg((ifnull(JS,0)+ifnull(Django,0)+ifnull(Database,0))) from ExamResult ;
>Max、Min
>求班级最高分和最低分(数值范围在统计中特别有用)
select Max((ifnull(JS,0)+ifnull(Django,0)+ifnull(OpenStack,0)))
最高分 from ExamResult;
select Min((ifnull(JS,0)+ifnull(Django,0)+ifnull(OpenStack,0)))
最低分 from ExamResult;
>求购物表中单价最高的商品名称及价格
>SELECT id, MAX(price) FROM order_menu;--id和最高价商品是一个商品吗?

SELECT MAX(price) FROM order_menu;

>注意:null 和所有的数计算都是null,所以需要用ifnull将null转换为0!ifnull(JS,0)
>with rollup的使用

3.9.7.7重点:Select from where group by having order by limit
>Mysql在执行sql语句时的执行顺序:
>from where select group by having order by
>分析:
select JS as JS成绩 from ExamResult where JS成绩 >70; ---- 不成功
select JS as JS成绩 from ExamResult having JS成绩 >90; --- 成功

3.9.7.8limit
SELECT * from ExamResult limit 1;
SELECT * from ExamResult limit 2,5;--跳过前两条显示接下来的五条纪录
SELECT * from ExamResult limit 2,2;


3.9.7.9使用正则表达式查询
SELECT * FROM employee WHERE emp_name REGEXP '^yu';

SELECT * FROM employee WHERE emp_name REGEXP 'yun$';

SELECT * FROM employee WHERE emp_name REGEXP 'm{2}';//有两个m

3.10 day47
3.10.1 mysql 多表查询
>主表//被绑定的这张表叫主表
CREATE TABLE ClassCharger(
id TINYINT PRIMARY KEY auto_increment,
name VARCHAR (20),
age INT ,
is_marriged boolean -- show create table ClassCharger: tinyint(1)
);
INSERT INTO ClassCharger (name,age,is_marriged) VALUES ("冰冰",12,0),("丹丹",14,0),("歪歪",22,0),("姗姗",20,0),("小雨",21,0);

>子表
CREATE TABLE Student(
id INT PRIMARY KEY auto_increment,
name VARCHAR (20),
charger_id TINYINT, --切记:作为外键一定要和关联主键的数据类型保持一致
-- [ADD CONSTRAINT charger_fk_stu]FOREIGN KEY (charger_id) REFERENCES ClassCharger(id))ENGINE=INNODB;

INSERT INTO Student(name,charger_id) VALUES ("alvin1",2),
("alvin2",4),
("alvin3",1),
("alvin4",3),
("alvin5",1),
("alvin6",3),
("alvin7",2);

CREATE TABLE Student(
id INT PRIMARY KEY auto_increment,
name VARCHAR (20),
charger_id TINYINT,
FOREIGN KEY (charger_id) REFERENCES ClassCharger(id)
);
ALTER TABLE Student ADD CONSTRAINT abc
FOREIGN KEY(charger_id)
REFERENCES classcharger(id);

>增加外键
ALTER TABLE Student ADD CONSTRAINT abc
FOREIGN KEY(charger_id)
REFERENCES classcharger(id);
>删除外键
ALTER TABLE Student DROP FOREIGN KEY abc;
3.10.2 级联删除与set null:
3.10.2.1 父表上update/delete记录时,同步 update/delete 子表绑定外键的匹配记录
>foreign key (charger_id) references ClassCharger(id) on delete cascade
3.10.2.2 父表上update / delete时,子表上匹配的记录设为 null --注意子表上的外键列不能为not null
>foreign key (charger_id) references ClassCharger(id) on delete set null

3.10.3 多表查询:
3.10.3.1 连接查询
3.10.3.1.1 内连接(交集):inner join -> A inner join B;A,B的顺序可颠倒。
>不使用inner join时: select tableA.name, tableB.name FROM day47.tableA,day47.tableB where tableB.tableA_id = tableA.id;
//相当于下:
> SELECT * FROM day47.tableB inner join day47.tableA on tableB.tableA_id = tableA.id;

3.10.3.1.2 外连接:
>左外连接:A left join B //以A表为坐标,匹配不到的保留A 的字段,对应的值为null;
>右外连接:A right join B //以B表为坐标,匹配不到的保留B的字段,对应的值为null;
3.10.3.1.3 全连接:full join;
> select * from tableB full join tableA on tableB.tableA_id = tableA.id; //mysql不支持全外连接
> select * from tableB left join tableA on tableB.tableA_id = tableA.id
union select * from tableB right join tableA on tableB.tableA_id = tableA.id; //使用这种方式实现全外连接
>union: 会去掉相同的记录
>union all : 会显示所有的记录
3.10.3.2 复合查询和子查询:
3.10.3.2.1 找出公司所有部门中年龄大于25岁的员工:
>select employee.emp_name, department.dept_id, department.dept_name, employee.age from department, employee where employee.dept_id = department.dept_id and employee.age > 10;
3.10.3.2.2 子查询
> in :
> select * from employee where employee.dept_id in (select department.dept_id from department);
> 带比较运算符:
=, !=, >, >=, <, <=, <, >,
> exists 子查询, 返回True执行()前的语句/False 则不执行()前的语句:
select * from employee where exists (select dept_name from department where dept_id=205);
3.10.3.3 mysql索引

3.10.3.3.1 创建普通索引 -> index/key 索引名(字段名) //其中索引名可以不写
> index -> create table emp(id int, name varchar(20), index index_name(name));//在where name时会按照索引搜索;
> key -> create table emp(id int, name varchar(20), key index_name(name));//在where name时会按照索引搜索;

3.10.3.3.2 创建唯一索引 unique -> unique index/key 索引名(字段名) //唯一索引的字段不能重复;

3.10.3.3.3 创建全局索引 fulltext -> fulltext index index_name(name)

3.10.3.3.4 创建空间索引 spatial
3.10.3.3.4 创建多列索引 index index_name(name, resume)
3.10.3.3.5 添加索引
> create -> create index index_name on db.tableA(name);
> alter -> alter table tableA add index index_name(name) [asc|desc]
3.10.3.3.6 删除索引: drop index 索引名 on 表名;


4.python与mysql的交互
4.1 python操作pymysql

 

4.1.1 连接数据库
import pymysql

#连接数据库
# db = pymysql.connect(host,port,user,passwd,db)

db = pymysql.connect("localhost","root","666666","test")

#使用cursor()方法创建一个游标对象
cursor = db.cursor()

#使用execute()方法执行SQL语句
cursor.execute("SELECT * FROM userinfo")

#使用fetall()获取全部数据
data = cursor.fetchall()

#打印获取到的数据
print(data)

#关闭游标和数据库的连接
cursor.close()
db.close()
4.1.2 数据库增删改操作 // commit()方法:在数据库里增、删、改的时候,必须要进行提交,否则插入的数据不生效。
4.1.2.1 增
import pymysql
config={
"host":"127.0.0.1",
"user":"root",
"password":"LBLB1212@@",
"database":"dbforpymysql"
}
db = pymysql.connect(**config)
cursor = db.cursor()
sql = "INSERT INTO userinfo (username,passwd) VALUES('jack','123')"
cursor.execute(sql)
db.commit() #提交数据
cursor.close()
db.close()


4.1.2.2 增
import pymysql
config={
"host":"127.0.0.1",
"user":"root",
"password":"LBLB1212@@",
"database":"dbforpymysql"
}
db = pymysql.connect(**config)
cursor = db.cursor()
sql = "INSERT INTO userinfo(username,passwd) VALUES(%s,%s)"
cursor.execute(sql,("bob","123"))
db.commit() #提交数据
cursor.close()
db.close()

4.1.2.3 增加多条
import pymysql
config={
"host":"127.0.0.1",
"user":"root",
"password":"LBLB1212@@",
"database":"dbforpymysql"
}
db = pymysql.connect(**config)
cursor = db.cursor()
sql = "INSERT INTO userinfo(username,passwd) VALUES(%s,%s)"
cursor.executemany(sql,[("tom","123"),("alex",'321')])
db.commit() #提交数据
cursor.close()
db.close()

4.1.2.4 查 fetchone():获取下一行数据,第一次为首行;
import pymysql
config={
"host":"127.0.0.1",
"user":"root",
"password":"LBLB1212@@",
"database":"dbforpymysql"
}
db = pymysql.connect(**config)
cursor = db.cursor()
sql = "SELECT * FROM userinfo"
cursor.execute(sql)
res = cursor.fetchone() #第一次执行
print(res)
res = cursor.fetchone() #第二次执行
print(res)
cursor.close()
db.close()


4.1.2.5 查 fetchall() 获取所有行数据源
import pymysql
config={
"host":"127.0.0.1",
"user":"root",
"password":"LBLB1212@@",
"database":"dbforpymysql"
}
db = pymysql.connect(**config)
cursor = db.cursor()
sql = "SELECT * FROM userinfo"
cursor.execute(sql)
res = cursor.fetchall() #第一次执行
print(res)
res = cursor.fetchall() #第二次执行
print(res)
cursor.close()
db.close()
#运行结果
((1, 'frank', '123'), (2, 'rose', '321'), (3, 'jeff', '666'), (5, 'bob', '123'), (8, 'jack', '123'), (10, 'zed', '123'))
()


4.1.2.6 查 fetchmany(4):获取下4行数据
> cursor = db.cursor(cursor=pymysql.cursors.DictCursor) #在实例化的时候,将属性cursor设置为pymysql.cursors.DictCursor
> cursor.scroll(1,mode='relative') # 相对当前位置移动,正数为光标向后移动,负数为光标向前移动;1,当前光标向后移动1个位置
cursor.scroll(-1, mode='relative') #表示当前光标向前移动一个位置

cursor.scroll(2,mode='absolute') # 相对绝对位置移动,表示光标移到第二位
第一个值为移动的行数,整数为向下移动,负数为向上移动,mode指定了是相对当前位置移动,还是相对于首行移动
4.1.2.7 改
4.1.2.8 删

4.1.3 上下文协议:
import pymysql
config={
"host":"127.0.0.1",
"user":"root",
"password":"LBLB1212@@",
"database":"dbforpymysql"
}
db = pymysql.connect(**config)
with db.cursor(cursor=pymysql.cursors.DictCursor) as cursor: #获取数据库连接的对象
sql = "SELECT * FROM userinfo"
cursor.execute(sql)
res = cursor.fetchone()
print(res)
cursor.scroll(2,mode='relative')
res = cursor.fetchone()
print(res)
cursor.close()
db.close()


4.2 mysql事务:
4.2.1
>开启事务: start transaction;
>回滚: rollback;
>提交事务: commit;
>保留点:savepoint;//设置临时占位符,可以发布和回退,与整个事务回退不同。
rollback to savepoint_name;

4.2.2 pymysql 处理事务:pymysql是基于事务,不需要开启。
> import pymysql
config = {
"host": "127.0.0.1",
"user": "root",
"password": "666666",
回滚 "db": "day48"
}
conn = pymysql.connect(**config)
cursor = conn.cursor()
try:
sql1 = "insert into lesson54(name, balance) values('bob', 2000)"

sql2 = "update lesson54 set balance=balance-30 where name='bob'"

sql3 = "update lesson54 set balance=balance+30 where name='bob'"

cursor.execute(sql1)
conn.commit()

cursor.execute(sql2)
raise Exception #代码执行到这里,报异常,回滚到上一次commit的地方
# cursor.execute(sql3)
cursor.close()
conn.commit()
except Exception as e:
conn.rollback()
conn.commit()

posted @ 2019-08-12 12:14  mezc  阅读(283)  评论(0编辑  收藏  举报