MySQL表的增删改查
MySQL表的增删改查
- CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写。
- 表的操作,是以一套记录为基本单位;
- 增、删只能是以一条记录为基本单位。
1. 新增(Create / Insert)
- 单引号、双引号====》用在数据记录中字符串、日期时间;
- 反引号====》用在结构中库名、表名、字段名 ;
- 只要小心避开使用关键字作为库名、表面、字段名,就可以完全不使用反引号。
1.1 插入 - 建表
-- 建表--》学生表 使用界面就可以
CREATE TABLE `db_11_20`.`students` (`id` INT NOT NULL AUTO_INCREMENT,`sn` INT NOT NULL COMMENT '学号',`name` VARCHAR(45) NOT NULL,`email` VARCHAR(200) NULL,PRIMARY KEY (`id`),UNIQUE INDEX `sn_UNIQUE` (`sn` ASC));
1.2 单行数据 + 全列插入
一次插入一行,并且插入的数据中包含所有字段的数据;
由于插入的是全字段,所以SQL中可以省略字段部分;
后边插入的值的顺序必须要和表结构中的顺序一样.
-- id,sn, name,email INSERT INTO students VALUES (100, 10000, '唐三藏', NULL); -- 由于id是主键,sn是唯一键,所以这两个的字段不能重复 INSERT INTO students VALUES (101, 10001, '孙悟空', '11111');
1.3 单行数据 + 指定列插入
一次插入一行,指定列的插入;
id(自增,视为有默认值); sn name(没有默认值); email(允许为NULL 视为有默认值,就是NULL);所以sn,name 在插入时必须有值;
INSERT INTO students (sn, name) VALUES (20001, '赤脚大仙'); -- 指定字段的顺序,不要求建表的顺序有关 -- 字段的顺序和传入值的顺序一致即可 INSERT INTO students ( name, sn) VALUES ('牛脚大仙',20003);
1.4 多行数据 + 全列插入
INSERT INTO students VALUES(204, 30001, '贾宝玉', 'jby@qq.com'), -- 一条记录(205, 30002, '林黛玉', NULL), -- 一条记录(206, 30003, '薛宝钗', NULL); -- 一条记录
1.5 多行数据 + 指定列插入
INSERT INTO students (sn, name,email) VALUES(40001,'宋江','s@qq.com'),(40002,'王英','w@qq.com');
2. 查询(Retrieve)
- 检索功能是DBMS中最核心的功能;DBMS 查询/检索 背后的原理是 关系代数;
2.1 查询 - 建表
-- 创建考试成绩表 DROP TABLE IF EXISTS exam_result; CREATE TABLE exam_result (id INT,name VARCHAR(20),chinese DECIMAL(3,1),math DECIMAL(3,1),english DECIMAL(3,1) ); -- 插入测试数据 INSERT INTO exam_result (id,name, chinese, math, english) VALUES(1,'唐三藏', 67, 98, 56),(2,'孙悟空', 87, 78, 77),(3,'猪悟能', 88, 98, 90),(4,'曹孟德', 82, 84, 67),(5,'刘玄德', 55, 85, 45),(6,'孙权', 70, 73, 78),(7,'宋公明', 75, 65, 30);
2.2 全列查询
代表是所有字段 顺序按照建表的顺序给出;
没有给出WHERE条件,代表什么数据都显示;
不推荐直接用,有缺点:
- 会展示所有的字段,实践中往往只需要查询需要的字段,性能比较好;
- 没有WHERE条件,当一张表有千万条记录时,会导致查询特别慢,可能会卡死;
SELECT * FROM exam_result;
2.3 指定列查询
指定列的顺序不需要按定义表的顺序来;
SELECT id, name, english FROM exam_result;
2.4 查询字段为表达式
实际上,SELECT后的投影可以是任意表达式;
表达式中可以有字段的参与,也可以没有
-- 表达式不包含字段 -- 一共有多少条记录,按照 WHERE 条件规则 -- 现在没有 WHERE 条件,是返回表中所有的记录,一共 7 条 SELECT id, name, 10 FROM exam_result; -- 表达式包含一个字段 SELECT id, name, english + 10 FROM exam_result; -- 表达式包含多个字段 SELECT id, name, chinese + math + english FROM exam_result;-- 查询每位同学的总分,包含多个字段的表达式 SELECT id,name,math + chinese + english FROM exam_result;
表达式中可以出现函数;
concat 函数就是字符串拼接,类似 java 中的 name + " 你好";
SELECT id,concat(name," 你好") FROM exam_result;
特殊的查询
1投影里使用了函数database();
2.没有指定查询源,只返回一行的数据;
SELECT DATABASE(); SELECT 1;
2.5 别名
为查询结果中的列指定别名,表示返回的结果集中,以别名作为该列的名称;
别名用中文没问题,但要求不要让库、表、字段名用中文;
别名用中文可以用,但不推荐用,否则以后写代码的时候,很容易出现字符集问题;
SELECT id,name,math + chinese + english AS 总分 FROM exam_result; SELECT id,name,math + chinese + english 总分 FROM exam_result; SELECT id 学号,name 姓名,math + chinese + english 总分 FROM exam_result;
2.6 去重:DISTINCT
使用DISTINCT关键字对某列数据进行去重;
SELECT math FROM exam_result; SELECT DISTINCT math FROM exam_result;SELECT name, math FROM exam_result; -- 无法合并 分数相同但是名字不同 -- SELECT name, DISTINCT math FROM exam_result;
2.7 统计行数的函数:COUNT
- 本来有的结果的行数 ,null不被看作是一条记录;
- count(*) : 包括了所有列,相当于计算行数,在统计结果中不会忽略 null;
- count(1) : 忽略所有列,用 1 代表代码行,在统计结果中不会忽略 null;
- count(列名) : 只包含列名那一列,在统计结果时 会忽略 null;
- 执行效率来说;
- 当列名是主键的时候, count(列名) 比 count(1) 快;
- 当列名不是主键, count(1) 比 count(列名) 快;
- 当表有多个列但没有主键时, count(1) 比count(*)快;
- 当有主键时, count(主键) 最优;
- 如果只有一个字段,count(*)最优;
-- 等价 前提:math NOT NULLSELECT COUNT(*) FROM exam_result;SELECT COUNT(math) FROM exam_result;SELECT COUNT(1) FROM exam_result; -- SELECT 1 有7条记SELECT COUNT(NULL) FROM exam_result; -- 0,null是7条记录,但是count中null不被看作一条记录SELECT COUNT(email) FROM students; -- 4 COUNT(email) 不算 email 是 Null 的情况SELECT COUNT(DISTINCT math) FROM exam_result; -- 去重后的数量
2.8 排序:ORDER BY
. 没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序;
没有 order by,看起来结果是按照 id 的顺序给出,但 MySQL 其实没有任何的保证,只是这个版本的 MySQL 刚好这么实现了;
NULL 数据排序,视为比任何值都小,升序出现在最上面,降序出现在最下面;
order by 重点在 order 不在于 by;order 排序、by 按照;
从小到大 (默认升序、非降序) ASC;从大到小 (降序、非升序) DESC;
SELECT * FROM exam_result ORDER BY id; SELECT * FROM exam_result ORDER BY id ASC; SELECT * FROM exam_result ORDER BY id DESC;SELECT * FROM exam_result ORDER BY math; SELECT * FROM exam_result ORDER BY math, id; SELECT * FROM exam_result ORDER BY math ASC, id DESC; -- math升序,当math值一样时,id降序 SELECT * FROM exam_result ORDER BY math DESC, id ASC;SELECT * FROM exam_result ORDER BY math + chinese + english DESC;SELECTid, name, math + chinese + english total FROM exam_result ORDER BY math + chinese + english DESC, id;SELECTid, name, math + chinese + english total FROM exam_result ORDER BY total DESC, id; -- order by 跟别名
2.9 条件查询:WHERE
WHERE 条件,由bool表达式组成,把每条记录带进去,保留结果是true的;
简单 a > b a >= b a <= b
SELECT 1 < 2; -- 真 1 SELECT 1 > 2; -- 假 0 SELECT 1 >= 2; -- 假 0 SELECT 1 <= 2; -- 真 1SELECT * FROM exam_result WHERE id < 3; SELECT id, name, id < 3 FROM exam_result; -- 只有前两个为真
相等使用一个=判断 a = b;无论是数值类型还是其他类型,都是用 = 进行相等判断;
SELECT '你好' = '你好'; -- 真 SELECT 1 = 1; -- 真 SELECT '你好' = '世界'; -- 假 SELECT 1 = 2; -- 假SELECT * FROM exam_result WHERE name = '猪悟能';
不相等 != <> a != b a <> b
SELECT '你好' != '你好'; -- 假 SELECT 1 != 1; -- 假 SELECT '你好' != '世界'; -- 真 SELECT 1 != 2; -- 真SELECT '你好' <> '你好'; -- 假 SELECT 1 <> 1; -- 假 SELECT '你好' <> '世界'; -- 真 SELECT 1 <> 2; -- 真SELECT * FROM exam_result WHERE name != '猪悟能';
针对 Null 的判断,不能用相等判断,必须用特殊方法
– a IS NULL a 为 null 时是 true
– a IS NOT NULL a 不为 null 时是 true
– MySQL 针对 Null 提出了特殊的表达式:a <=> b ,判断 a 是否等于 b,并且支持 a、b 都是 Null 的情况-- Null 对于某个数据是不可知的 -- 与 Null 参与的表达式运算(暂时不考虑特例),结果也是 Null -- 有不知道的值参与的表达式,结果还是不知道 SELECT NULL = NULL; -- 假,Null 又被视为假 null不参与判断 SELECT NULL IS NULL; -- 真 SELECT NULL IS NOT NULL; -- 假 SELECT 1 IS NULL; -- 假 SELECT 1 IS NOT NULL; -- 真SELECT name, email, email = NULL FROM students;-- 一个结果表达式只要有null参与就全部都是null SELECT name, email, email != NULL FROM students; SELECT name, email FROM students WHERE email = NULL; -- 没有符合条件的结果 SELECT name, email FROM students WHERE email != NULL; -- 没有符合条件的结果 全部是null-- 正确用法 SELECT name, email FROM students WHERE email IS NULL; SELECT name, email FROM students WHERE email IS NOT NULL;
与 AND 不用 &&
SELECT 1 AND 1; -- 真 与上真 ==》真 SELECT 0 AND 1;-- 假
或 OR 不用 ||
SELECT 0 OR 1;
非 NOT 不用 !
SELECT !0; -- 真 SELECT !1; -- 假
-- 找到不及格的同学 <60 或的关系 SELECT * FROM exam_result WHERE chinese < 60 OR math < 60 OR english < 60; -- 找到三好学生 》80 SELECT * FROM exam_result WHERE chinese >= 80 AND math >= 80 AND english >= 80;SELECT * FROM exam_result WHERE name != '猪悟能'; SELECT * FROM exam_result WHERE name = '猪悟能';SELECT * FROM exam_result WHERE math > 80 AND (chinese < 60 OR english < 60);
a BETWEEN 10 AND 20 相当于 a >= 10 AND a <= 20 为 真;
-- 查询2021-11-22 号出版的文章 SELECT * FROM articles WHERE published_at BETWEEN '2021-11-22 00:00:00' AND '2021-11-22 23:59:59';
a IN (‘AA’, ‘BB’, ‘CC’) contains 包含关系 相当于a == ‘AA’ OR a == ‘BB’ OR a == ‘CC’ 查找前面的在不在后面的集合中;
SELECT '你好' IN ('你好', '世界'); -- 该方法更好,有发挥空间 SELECT '你好' = '你好' OR '你好' = '世界'; -- 手动历找查找;SELECT * FROM exam_result WHERE (math BETWEEN 60 AND 70) AND math != 70; -- [60,70) SELECT * FROM exam_result WHERE name IN ('唐三藏' , '孙悟空');
模糊查询:LIKE
-- _代表的是1个字符,可以是任意字符; -- 找到名字是 孙开头的,并且有3个字符,但后边是什么都行 SELECT * FROM exam_result WHERE name LIKE '孙__'; -- % 代表的是 任意(>=0)个字符,可以是任意字符 -- 找到名字是 孙开头的 SELECT * FROM exam_result WHERE name LIKE '%孙%'; -- 只要带孙字的都是
练习:
- 查询用户user表中,满足以下条件的用户数据:
- ID在1至200或300至500,且账号accout列不为空
- 充值金额amount在1000以上。
SELECT * FROM user WHERE (id (BETWEEN 1 AND 200) OR (BETWEEN 300 AND 500)) AND account IS NOT NULL AND amount > 1000;
- 在图书表中新增一条记录:Java核心技术、作者“Cay S. Horstman”,价格56.43,分类为“计算机技术”;
INSERT INTO books VALUES ('Java核心技术', 'Cay S. Horstman', 56.43, '计算机技术');
2.10 分页查询:LIMIT 字句
按照实现已经存在的表结构进行建表;
-- 按照(Like) db_11_20.exam_result 这张表的结构,去创建一个相同结构的表,叫做 -- db_11_23.exam_result CREATE TABLE db_11_23.exam_result LIKE db_11_20.exam_result;
原始表中,查询出数据,并且插入新表中;
-- 按照 SELECT * FROM db_11_20.exam_result 查询出数据 -- 把查询出的数据,插入到 db_11_23.exam_result 表中 -- 要求,新表和老表的结构是一致的 INSERT INTO db_11_23.exam_result SELECT * FROM db_11_20.exam_result;
要使用 LIMIT,必须带上 ORDER BY,否则,视为在一个无序的数组中进行范围过滤,得到的结果是行为未定义;
LIMIT 子句:从查询出的结果中过滤出一个范围出来;标准用法:LIMIT n OFFSET s,从结果的第 s 条时(s 是下标,从 0 开始),保留 n 条数据;
假如,把结果看成数组, 最后得到的结果是 [s] 到 [s + n - 1];
SELECT * FROM exam_result ORDER BY id LIMIT 4 OFFSET 1; -- 假如 OFFSET + LIMIT 大于结果长度怎么办 -----》有多少条数据,给多少条数据 SELECT * FROM exam_result ORDER BY id LIMIT 100 OFFSET 1;-- LIMIT 字句的两个变形用法 -- 视为LIMIT 3 OFFSET 0 SELECT * FROM exam_result ORDER BY id LIMIT 3; -- 视为LIMIT 4 OFFSET 1 SELECT * FROM exam_result ORDER BY id LIMIT 1,4; -- 推荐使用 LIMIT n OFFSET s,含义清晰
最大的应用就是分页功能;
例如,规定一页最多20条
-- 第一页 SELECT * FROM exam_result ORDER BY id LIMIT 20 OFFSET 0; -- 第二页 从20下标开始,保留20条 SELECT * FROM exam_result ORDER BY id LIMIT 20 OFFSET 20; -- 第三页 从40下标开始,保留20条 SELECT * FROM exam_result ORDER BY id LIMIT 20 OFFSET 40; -- 以此类推 第n页 -- SELECT * FROM exam_result ORDER BY id LIMIT 20 OFFSET 20*(n-1);
在TIMELINE (在一页完了以后下滑刷新)中应用
SELECT * FROM exam_result WHERE id > 0 ORDER BY id LIMIT 20 OFFSET 0; -- 在上一次拿到的所有数据中,取出 id 最大的 1 条,比如是 21 SELECT * FROM exam_result WHERE id > 21 ORDER BY id LIMIT 20 OFFSET 0; -- 在上一次拿到的所有数据中,取出 id 最大的 1 条,比如是 51 SELECT * FROM exam_result WHERE id > 51 ORDER BY id LIMIT 20 OFFSET 0;
2.11 小结
select… [from] [where] [order by] [limit];
从给定查询源(from…),进行选择(where…)、投影(select…)、排序(order by …)、取范围(limit…)、查询/检索出用户需要的数据;
slesct 投影
- *代表全字段;
- 用逗号分割的表达式,表达式可以有 字面量(1、“Hello”)、字段(name)、函数调用等参与的运算表达式;
- 任意表达式,都可以给出别名;
- 某些情况下,可以去重 distinct;
- count(…)这个函数调用必须掌握;
from 查询源
- 表名;
- 表名也可以使用别名 exam_result | exam_result AS er 把er作为表的别名;
where 选择
- 让查询源中的每条记录,都经过where指定的bool表达式,然后只保留结果为真的记录;
order by
- 没有order by,查询结果认为无序;
- order by 默认为升序(asc),可以指定为降序(desc);
- order by 允许指定多字符,含义:优先按照第一个字段为依据进行排序,在第一字段的值相等的情况下,第二个字段的指定进行排序;
- order by可以使用字段的别名;
limit 取范围
- limit … offset… offset 偏移 limit 限制;
练习:
- 查询用户user表中,满足以下条件的用户数据:
- ID在1至200或300至500,且账号accout列不为空
- 充值金额amount在1000以上。
SELECT * FROM user WHERE (id (BETWEEN 1 AND 200) OR (BETWEEN 300 AND 500)) AND account IS NOT NULL AND amount > 1000;
- 在图书表中新增一条记录:Java核心技术、作者“Cay S. Horstman”,价格56.43,分类为“计算机技术”;
INSERT INTO books VALUES ('Java核心技术', 'Cay S. Horstman', 56.43, '计算机技术');
3.更新(Update)
指定where条件(如果不写where,视为所有记录都满足条件),一定可以选择出一批记录(可能只有1条,或者1条都没有);
只能统一将这批记录中的指定字段的值,一次性进行修改;
UPDATE exam_result SET chinese = 60 WHERE id BETWEEN 1 AND 3;UPDATE exam_result SET chinese = 30 WHERE id = 1; UPDATE exam_result SET chinese = 60 WHERE id = 2; UPDATE exam_result SET chinese = 90 WHERE id = 3; -- 表中所有记录都符合条件,chinese都变成了40 UPDATE exam_result SET chinese = 40; -- 允许修改时,一次修改多个字段 -- 字段直接使用,隔开 UPDATE exam_result SET chinese = 10, math = 20, english = 30 WHERE id BETWEEN 1 AND 3; -- 修改时,以字段的原来的值作为基础进行修改 UPDATE exam_result SET math = math/2 WHERE not (id BETWEEN 1 AND 3); -- 注意,不支持 math -= 3、math += 10,只能 math = math - 3、math = math + 10
错误:Error Code:1264.Out of range value for column ‘math’ at row 40.000sec;
表示在插入or修改时,某个字段的值超出了字段数据类型规定的数据范围了(out of range);
4.删除(Delect)
先通过where条件选择出一批记录 ,把符合条件的记录全部删除;
不加where条件,意味着所有记录都满足条件;
-- 目标: 只删除 孙悟空 -- delete 和from 中间没有东西 DELETE FROM exam_result WHERE id = 2; DELETE FROM exam_result WHERE name = '孙悟空'; DELETE FROM exam_result WHERE name LIKE '孙__';-- 正确的前提,知道表中只有孙悟空 DELETE FROM exam_result WHERE name LIKE '孙%'; -- 错误(没有达到期望,不是数据库错误) 会把表中的孙权也删掉 -- 不加where条件,意味着所有记录都满足条件,所以是全表中的所有数据统统删除(慎用) DELETE FROM exam_result;
建议
1.再删除之前,先用select + 同样的where条件确认下数据是否满足预期;
2.能用上主键删除,优先用主键删除;由于主键不会重复,所以使用主键是最准确的;
3.从数据安全的角度,核心数据一定要做备份;
INSERT INTO db_11_23.exam_result SELECT * FROM db_11_20.exam_result;
截断表: DDL 操作,针对表结构的操作,视为把表结构复位(reset);
-- 主要体现的自增的 id 上,重点观察其生成的 id truncate exam_result; insert into exam_result (name, math, chinese, english) values ('A', 1, 1, 1);-- 自增id变为1-- 对比全表数据删除:DML 操作,针对表中的数据操作的,表结构不动 delete from exam_result; insert into exam_result (name, math, chinese, english) values ('A', 1, 1, 1); -- 自增id变为8
truncate 和 delete 一样,也是谨慎使用;
如果已经明确要把表清空了,使用 truncate 会比 delete from 来的速度快; truncate 是时间复杂度是 O(1) :只需要动表结构,不管多少条数据; delete from 的时间复杂度是 O(n) :挨个记录遍历,删除;
图形界面的truncate:
MySQL表的增删改查相关推荐
- 数据库概论之MySQL表的增删改查1
MySQL表的增删改查 1.MySQL表的CRUD 2.插入数据 2.1 语法 2.2 注意事项 3.查找语句 3.1 全列查找 3.2 指定列查询 3.3 指定查询字段为表达式 3.4 查询字段指定 ...
- MYSQL表的增删改查进阶(下)
MYSQL表的增删改查进阶 4. 查询 4.1 聚合查询 4.1.1 聚合函数 4.1.2 group by字句 4.1.3 having 4.2 联合查询 4.2.1 内连接 4.2.2 外连接 4 ...
- 2.MySQL表的增删改查(进阶)
这里写目录标题 MySQL表的增删改查(进阶) 1.数据库约束 2.表的设计 3.新增 4.查询 4.1 聚合查询 4.2 联合查询 5.内容重点总结 MySQL表的增删改查(进阶) 1.数据库约束 ...
- MySQL表的增删改查(基础)
MySQL表的增删改查(基础) 文章目录 MySQL表的增删改查(基础) 新增(`Create`) 查询(`Retrieve`) 更新(`Update`) 删除(`Delete`) 总结 注释:在SQ ...
- 【MySQL系列】 MySQL表的增删改查(进阶)
目录 ??前言 ??一.数据库约束 ???1.1 约束类型 ???1.2 null约束 ???1.3 unique约束 ???1.4 default约束 ???1.5 primary key 约束 ? ...
- php mysql表的增删改查,PHP 之Mysql增删改查操作案例
1:user表: CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL, PR ...
- MySQL表的增删改查--你都知道吗?
文章目录 CRUD 查询 修改 删除 数据库约束 数据库的设计 插入查询的数据 聚合查询 分组查询 联合查询/多表查询(重点) 内连接与外连接 子查询 合并查询 注释:在SQL中使用 --(空格) + ...
- 【MySQL】(万字解析)MySQL表的增删改查(进阶-上)
快速跳转✅ 1.数据库的约束 1.1 约束类型 1.2 NULL约束 1.3 UNIQUE:唯一约束 1.4 DEFAULT:默认值约束 1.5 PRIMARY KEY:主键约束 1.6 FOREIG ...
- mysql 表结构 增删改查_mysql学习【第3篇】:数据库之增删改查操作
注意的几点: 1.如果你在cmd中书命令的时候,输入错了就用\c跳出 2.\s查看配置信息 一.操作文件夹(库) 增:create database db1 charset utf8; 删:drop ...
最新文章
- 卫星数据现已加入 Azure 豪华套餐,在太空向女神表个白?
- vue 组件属性监听_Vue.js 监听属性
- linux kernel 三次握手建立TCP链接的实现
- 如何在Spring中将@RequestParam绑定到对象
- 九张 Gif 图回顾 Web 设计的 25 年历史
- centos7下docker设置阿里云镜像(自定义阿里云镜像)
- 计算机专业外语的特点,计算机专业英语在邮政信息技术领域的应用特点|计算机专业哪个好...
- spark分片个数的确定及Spark内存错误(GC error)的迂回解决方式
- 【原创】Java移位运算
- 好看的vscode字体
- 23种PHP开发工具PHP IDE集合
- Unity Transform 学习
- 基于echarts+js+fexible.js实现的数据可视化适配案例(附源代码)
- b站网页版改html,网页版b站怎么设置弹幕?网页bilibili怎么设置停止播放和调倍速?...
- 应聘华为各类工程师通信基础题库以及答案
- dialog设置最大高度占比
- vue-element-admin 和 python django 前后端分离 开撸(新手学习,高手指点)
- 实验四 自动化测试工具-软件测试
- XP定时关机、查看和取消指令
- 要分析数据,可以先去这些数据网站找数据
热门文章
- 标量变量 c语言,标量变量
- 尚济 形意拳经解[七]内功经解
- Log Forging漏洞
- java E201_02_01个人所得税 计算器
- 【递归】两道程序题理解递归
- DirectX12(D3D12)基础教程(十一)——几个“上古时代”的基于Pixel Shader的滤镜效果
- 神雕侠侣手游修改服务器端口,神雕侠侣手游7月29日更新内容 部分服务器开启【常规跨服】玩法...
- 计算机考研政治难度系数有多大,考研政治难度系数比去年略低 分数线或和去年接近--教育--人民网...
- PB修改器,powerbuilder源码下载,pb反编译大师,最新测试版
- 笔记本电脑连接wifi有时候会自动断网提示有限的访问权限解决办法