MySQL数据库 各种指令操作大杂烩(DML增删改、DQL查询、SQL...)
创始人
2024-05-29 10:42:59
0

文章目录

  • 前言
  • 一、DML 增删改
    • 添加数据
    • 修改数据
    • 删除数据
  • 二、DQL 查询
    • 基本查询
    • 条件查询
    • 聚合函数(count、max、min、avg、sum)
    • 分组查询(group by)
    • 排序查询(order by)
    • 分页查询(limit)
    • DQL 语句练习
  • 三、SQL
    • DCL 权限控制
    • 约束案例
    • 多表查询
    • 事务
    • 存储引擎
    • 字符串函数
    • 数值函数
    • 日期函数
    • 流程函数


前言

本篇选自本人前段时间对MySQL的皮毛学习,在这里进行一个简单的汇总,希望能对读者有或多或少的帮助,若有什么不懂的知识盲区,可在评论区交流讨论。


一、DML 增删改

添加数据

    1. 给指定字段添加数据 insert into 表名(字段1,字段2…) values (值1,值2…);
insert into employee(id, workno, name, gender, age, idcard, entrydate)  values (1,'1','Itcase','男',10,'012345678998765432','2022-9-19');
    1. 查看表中的值
select * from employee;
    1. 给全部字段添加数据 insert into 表名 values (值1,值2…);
insert into employee values(2,'2','张无忌','男',18,'012345678901234567','2022-9-19');
    1. 批量添加数据 inset into 表名 (字段1,字段2…) values (值1,值2…),(值1,值2…),(值1,值2…);
#insert into 表名 values (值1,值2...),(值1,值2...),(值1,值2...);
insert into employee values(3,'3','韦一笑','男',28,'012345678901234567','2022-9-19'),(4,'4','张三丰','男',38,'012345678901234567','2022-9-19');

修改数据

update 表名 set 字段1=值1,字段2=值2,… [where 条件];

    1. 修改id为1的数据,将name修改为itheima
update employee set name = 'itheima' where id=1;
    1. 修改id为1的数据,将name修改为小昭,gender修改为女
update employee set name='小昭',gender='女' where id=1;
    1. 将所有的员工入职日期修改为2008-01-01
update employee set entrydate='2008-01-01';

删除数据

delete from 表名 [where 条件]

    1. 删除 gender为女的员工
delete from employee where gender='女';
    1. 删除所有员工
delete from employee;
    1. 删除employee表
drop table employee;

二、DQL 查询

数据准备

create table emp(id          int                 comment '编号',workno      varchar(10)         comment '工号',name        varchar(10)         comment '姓名',gender      char(1)             comment '性别',age         tinyint unsigned    comment '年龄',idcard      char(18)            comment '身份证号',workaddress varchar(50)         comment '工作地点',entrydate   date                comment '入职时间'
) comment '员工表';

插入数据

insert into emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
values  (1,'1','柳岩','女',20,'123654879654123658','北京','2000-01-01'),(2,'2','张无忌','男',18,'123654879654123611','北京','2005-09-01'),(3,'3','韦一笑','男',38,'123654879654123650','上海','2005-08-01'),(4,'4','赵敏','女',18,'123654879654123658','北京','2009-12-01'),(5,'5','小昭','女',16,'123654879654120008','上海','2007-07-01'),(6,'6','杨逍','男',28,'123654879654120058','北京','2006-01-01'),(7,'7','范瑶','男',40,'123654879650023658','北京','2005-05-01'),(8,'8','黛绮丝','女',38,'123654870054123658','天津','2015-05-01'),(9,'9','范凉凉','女',45,'123654879654123658','北京','2010-04-01'),(10,'10','陈友谅','男',53,'123054879654123658','上海','2011-01-01'),(11,'11','张士诚','男',55,'103654879654123658','江苏','2015-05-01'),(12,'12','常遇春','男',32,'120654879654123658','北京','2004-02-01'),(13,'13','张三丰','男',88,'123654879654123658','江苏','2020-11-01'),(14,'14','灭绝','女',65,'123650000654123658','西安','2019-05-01'),(15,'15','胡青牛','男',70,'123654879654120000','西安','2018-04-01'),(16,'16','周芷若','女',18,null,'北京','2012-06-01');

基本查询

select 字段列表 from 表名列表

    1. 查询多个字段 select 字段1,字段2… from 表名;
select * from 表名;
    1. 设置别名
select 字段1 [as 别名1],字段2 [as 别名2]... from 表名;
    1. 去除重复记录
select distinct 字段列表 from 表名;
  • (1) 查询指定字段 name,workno,age 返回
select name,workno,age from emp;
  • (2)查询所有字段返回
select id,workno, name, gender, age, idcard, workaddress, entrydate from emp;
select * from emp;
  • (3)查询所有员工的工作地址,起别名
select workaddress as '工作地址' from emp;
select workaddress '工作地址' from emp;   #as可省略
  • (4)查询公司员工的上班地址(不要重复)
select distinct workaddress '工作地址' from emp;

条件查询

select 字段列表 from 表名 where 条件列表;

    1. 查询年龄等于88的员工
select * from emp where age=88;
select id,workno, name, gender, age, idcard, workaddress, entrydate from emp where age=88;
    1. 查询年龄小于20的员工信息
select * from emp where age<20;
    1. 查询小于等于20的员工信息
select * from emp where age<=20;
    1. 查询没有身份证号的员工信息
select * from emp where idcard is null;
    1. 查询有身份证号的员工信息
select * from emp where idcard is not null;
    1. 查询年龄不等于88的员工信息
select * from emp where age!=88;
select * from emp where age<>88;
    1. 查询年龄在15岁(包含)到20岁(包含)之间的员工信息
select * from emp where age>=15 && age <=20;
select * from emp where age>=15 and age <=20;
select * from emp where age between 15 and 20;
    1. 查询性别为女且年龄小于25岁的员工信息
select * from emp where gender='女' and age<25;
    1. 查询年龄等于18或20或40的员工信息
select * from emp where age=18 || age =20 || age=40;
select * from emp where age=18 or age =20 or age=40;
select * from emp where age in(18,20,40);
    1. 查询名字为俩个字的员工信息 一个’_‘代表一个字符
select * from emp where name like '__';
  • 11.查询身份证号最后一位是0的员工信息 一个’%‘代表任意字符
select * from emp where idcard like '%0';
select * from emp where idcard like '_________________0';

聚合函数(count、max、min、avg、sum)

select 聚合函数(字段列表) from 表名;

    1. 统计该企业员工数量
select count(*) from emp;
    1. 统计该企业员工的平均年龄
select avg(age) from emp;
    1. 统计该企业员工的最大年龄
select max(age) from emp;
    1. 统计该企业员工的最小年龄
select min(age) from emp;
    1. 统计西安地区员工的年龄之和
select sum(age) from emp where workaddress='西安';

分组查询(group by)

select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];

    1. 根据性别分组,统计男性员工和女性员工
select gender,count(*) from emp group by gender;
    1. 根据性别分组,统计男性员工和女性员工的平均年龄
select gender,avg(age) from emp group by gender;
    1. 查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址
select workaddress, count(*) from emp where age<45 group by workaddress having count(*)>=3;

排序查询(order by)

select 字段列表 from 表名 order by 字段1 排序方式1,字段2 排序方式2;

    1. 根据年龄对公司的员工进行升序排序
select * from emp order by age asc;
select * from emp order by age;   #默认会升序
select * from emp order by age desc;  #降序
    1. 根据入职时间,对员工进行降序排序
select * from emp order by entrydate desc;
    1. 根据年龄对公司的员工进行升序排序,年龄相同,再按照入职时间进行降序排序
select * from emp order by age asc,entrydate desc;

分页查询(limit)

select 字段列表 from 表名 limit 起始索引,查询记录数;

    1. 查询第一页员工数据,每页展示10条记录
select * from emp limit 0,10;
select * from emp limit 10;   #可以省略起始索引0
    1. 查询第二页员工数据,每页展示10条记录 起始索引=(查询页码-1)*每页显示记录数
select * from emp limit 10,10;

DQL 语句练习

DQL 语句执行顺序: from->where->group by->select->order by->limit

    1. 查询年龄为20,21,22,23岁的女性员工信息。
select * from emp where age in(20,21,22,23) and gender='女';
    1. 查询性别为男,并且年龄在20-40岁(含)以内的姓名为三个字的员工。
select * from emp where gender='男'and age>20 and age<=40 and name  like '___';
    1. 统计员工表中,年龄小于60岁的,男性员工和女性员工的人数。
select gender, count(*) from emp where age<60 group by gender;
    1. 查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序
select name,age from emp where age<=35 order by age asc,entrydate desc  ;
    1. 查询性别为男,且年龄在20-40岁(含)以内的前3个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序.
select * from emp where gender='男' and age<=40 and age>=20 order by age asc ,entrydate desc limit 3;

三、SQL

查询用户

user mysql;   
select * from user;

直接选中左框中的mysql,找到user表,双击即可查看用户

创建用户

create user '用户名'@'主机名' identified by '密码';

修改用户密码

alter user '用户名'@'主机名' identified with mysql_native_password by '新密码';

删除用户

drop user '用户名'@'主机名';
    1. 创建用户itcast,只能够在当前主机localhost访问,密码123456;
create user 'itcase'@'localhost' identified by '123456';
    1. 创建用户heima,可以在任意主机访间该数据库,密码123456;
create user ' heima' @'%' identified by '123456';
    1. 修改用户heima的访问密码为1234;
alter user ' heima'@'%' identified with mysql_native_password by '1234';
    1. 删除itcast@localhost用户;
drop user 'itcase'@'localhost';

DCL 权限控制

    1. 查询权限
show grants for '用户名'@'主机名';
    1. 授予权限
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
    1. 撤销权限
remove 权限列表 on 数据库名.表名 from '用户名'@'主机名';

约束案例

约束名称           描述                                          关键字
非空约束    保证列中所有数据不能有null值                             NOT NULL
唯一约束    保证列中所有数据各不相同                                 UNIQUE
主键约束    主键是一行数据的唯一标识,要求非空且唯一                    PRIMARY KEY
检查约束    保证列中的值满足某一条件                                 CHECK
默认约束    保存数据时,未指定值则采用默认值                           DEFAULT
外键约束    外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性     FOREIGN KEY
  • 员工表 在创建表时添加约束
create table emp1 (id int primary key auto_increment ,  -- 员工id,主键且自增长ename varchar(50) not null unique ,  -- 员工姓名,非空并且唯一joindate date not null ,  -- 入职日期,非空salary double(7,2) not null ,  -- 工资,非空bonus double(7,2) default 0  -- 奖金,如果没有奖金默认为0
);

– 例:建完表后添加约束 alter table 表名 modify 字段名 数据类型 not null;
– 删除约束: alter table 表名 modify 字段名 数据类型;

show databases ;
use itcase;
show tables ;
select * from emp1;
drop table dept;
insert into emp1(id, ename, joindate, salary, bonus) values (1,'张三','1999-11-11',8800,5000);
    1. 添加约束

(1) 创建表时添加外键约束

CREATE TABLE表名(列名  数据类型,...[CONSTRAINT] [外键名称] FOREIGN KEY(外键列名)REFERENCES 主表(主表列名)
);

(2) 建完表后添加外键约束

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名称)REFERENCES 主表名称(主表列名称);

例:alter table emp add constraint fk_emp_dept foreign key(dep_id) references dept(id);

    1. 删除约束
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
例:alter table emp drop foreign key fk_emp_dept;
    1. 练习
-- 部门表
create table dept (id int primary key auto_increment ,  -- 部门id,主键且自增长dep_name varchar(20) ,  -- 部门名addr varchar(20)        -- 部门地址
);
-- 员工表
create table emp (id int primary key auto_increment ,  -- 员工id,主键且自增长name varchar(20) ,  -- 员工姓名age int,dep_id int,   -- 所属部门id-- 添加外键  dep_id,关联dept表的id主键constraint fk_emp_dept foreign key(dep_id) references dept(id)
);
-- 添加俩个部门
insert into dept(dep_name, addr) values ('研发部','广州'),('销售部','深圳');-- 添加员工 dep_id 表示员工所在的部门
insert into emp(name,age,dep_id) values ('张三',20,1),('李四',20,1),('王五',20,1),('赵六',20,2),('孙七',20,2),('周八',20,2);
select * from emp;

多表查询

    1. 隐式内连接
      select 字段列表 from 表1,表2… where 条件;
select emp.id,emp.name,emp.age,dept.dep_name from emp,dept where emp.dep_id=dept.id;
select t1.id,t1.name,t1.age,t2.dep_name from emp t1,dept t2 where t1.dep_id=t2.id;  
    1. 显示内连接
      select 字段列表 from 表1 [inner] join 表2 on 条件;
select * from emp inner join dept on emp.dep_id=dept.id;
select * from emp join dept on emp.dep_id=dept.id;    #inner可省略
    1. 左外连接
      select 字段列表 from 表1 left [outer] join 表2 on 条件;

左外连接:相当于查询A表所有数据和交集部分数据

select * from emp left join dept on emp.dep_id=dept.id;
    1. 右外连接
      select 字段列表 from 表1 right [outer] join 表2 on 条件

右外连接:相当于查询B表所有数据和交集部分数据

select * from emp right join dept on emp.dep_id=dept.id;
    1. 子查询:
      单行单列:作为条件值,使用=、!=、>、<等进行条件判断
      select 字段列表 from 表 where 字段名=(子查询);

(1) 查询‘财务部’所有的员工信息 emp是员工表 dept是部门表

select id from dept where dname='财务部';    获取财务部的部门id号
select * from emp where dep_id=(select id from dept where dname='财务部');
    1. 多行单列:作为条件值,使用in等关键字进行条件判断
      select 字段列表 from 表 where 字段名 in (子查询);

(2) 查询‘财务部’和‘市场部’所有的员工信息 emp是员工表 dept是部门表

select id from dept where dname='财务部' or dname='市场部';    获取财务部和市场部的部门id号
select * from emp where dep_i in (select id from dept where dname='财务部' or dname='市场部');
    1. 多行多列:作为虚拟表
      select 字段列表 from (子查询) where 条件;

(3) 查询入职日期是’2011-11-11’之后的员工信息和部门信息

select * from emp where join_data>'2011-11-11';   获取入职日期是'2011-11-11’之后的员工信息
select * from (select * from emp where join_data>'2011-11-11') t1,dept where t1.dep_id=dept.id;

事务

  • 1. 开启事务
    start transaction; 或者 begin
  • 2. 提交事务
    commit;
  • 3. 回滚事务
    rollback;
-- 创建账户表
drop table if exists account;
create table account(id int primary key auto_increment,name varchar(10),money double(10,2)
);
select * from account;
-- 添加数据
insert into account(name,money) values('张三',1000),('李四',1000);update account set money=1000;   #设置 张三李四 余额变为1000
    1. 转账操作

(1)开启事务

begin ;

(2)查询李四的余额

select money from account where name='李四';

(3)李四金额 -500

update account set money=money-500 where name='李四';

(4)张三金额 +500

update account set money=money+500 where name='张三';
    1. 提交事务
commit ;
    1. 回滚事务
rollback ;

事务四大特征:

  • 原子性(Atomicity):事务是不可分割的最小操作单位,要么同时成功,要么同时失败

  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态

  • 隔离性(lsolation) :多个事务之间,操作的可见性

  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

    1. 查询事务的默认提交方式
      select @@autocommit; #1为自动 0为手动 mysql数据库默认为自动
    1. 修改事务的提交方式
      set @@autocommit=0; # 0 为手动方式 即需要手动调用 commit;

并发事务问题:

  • 脏读:一个事务读到另外一个事务还没有提交的数据。
  • 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复
  • 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了"幻影”。

事务隔离级别:

                    脏读    不可重复读   幻读
read uncommitted     有         有       有
read committed       0          1        1
repeatable read      0          0        1
serializable         0          0        0
  • 查看事务隔离级别
select @@transaction_isolation;
  • 设置事务隔离级别
set [session | global] transaction isolation level {read uncommitted | read committed | repeatable read | serializable }
set session transaction isolation level read uncommitted ;
set session transaction isolation level repeatable read ;

存储引擎

    1. 查询建表语句 —默认存储引擎:InnoDB
show create table account;
    1. 查询当前数据库支持的存储引擎
show engines ;
    1. 创建表my_myisam,并指定MyISAM存储引擎
create table my_myisam(id int,name varchar(10)
)engine =MyISAM;

字符串函数

    1. concat 字符串连接
select concat('hello','MySQL');
    1. lower 都转为小写
select lower('Hello');
    1. upper 都转为大写
select upper('Hello');
    1. lpad 向左填充
select lpad('01',5,'hadia');   # 将字符串’hadia‘给字符串’01‘ 左边填充至5个字符
    1. rpad 向右填充
select rpad('01',5,'hadia');
    1. trim 去除首尾的空格
select trim(' hello to me ');
    1. substring 截取字符
select substring('hello mysql',1,5);    #截取字符串的 第一个位置开始的5个字符

(1)案例:由于业务需求变更,企业员工的工号统一为5位数,目前不足5位数的全部在前面补0,如1号员工的工号应该为00001

update user set name=lpad(name,5,'0');   # 因为id为int型需要string型,所以这里用name代替

数值函数

    1. ceil() 向上取整
select ceil(1.1);
    1. floor(x) 向下取整
select floor(1.9);
    1. mod(x,y) 返回x/y的模
select mod(3,4);
    1. rand() 返回0~1内的随机数
select rand();
    1. round(x,y) 求参数x的四舍五入的值,保留y位小数
select round(2.345,2);

(2)案例:通过数据库的函数,生成一个六位数的随机验证码

select lpad(round(rand()*1000000,0),6,'0');

日期函数

    1. curdate() 返回当前日期
select curdate();
    1. curtime() 返回当前时间
select curtime();
    1. now() 返回当前日期和时间
select now();
    1. year(date) 获取指定date的年份
select year(now());
    1. month(data) 获取指定date的月份
select month(now());
    1. day(date) 获取指定date的日期
select day(now());
    1. date_add(date,interval expr type) 返回一个日期/时间值加上一个时间间隔expr后的时间值
select date_add(now(),interval 70 day );    #从现在日期往后推70天  interval是固定值,70是变值,day是可变的时间单位 month、year
    1. datediff(date1,date2) 返回起始时间date1和结束时间date2之间的天数
select datediff('2022-10-1','2022-9-26');

(3)案例:查询所有员工的入职天数,并根据入职天数倒序排序

select name,datediff(curdate(),entrydate) as 'days' from emp order by days desc;   # entrydate为员工表中的入职天数(这里没创建)

流程函数

    1. if(value,t,f) 如果value为true,则返回t,否则返回f
select if(true,'ok','error');
select if(false,1,0);
    1. ifnull(value1,value2) 如果value1不为空,返回value1,否则返回value2
select ifnull('ok','default');
select ifnull(' ','default');
select ifnull(null,0);
    1. case where[val1] then [res1]… else [default] end 如果val1为true,返回res1,否则返回default默认值

(1)需求:查询emp表的员工姓名和工作地址(北京/上海—> 一线城市,其他----> 二线城市)

select name,(case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end) as '工作地址' from emp;   # workaddress为表中的工作地址,emp为表名
    1. case [expr] when [val1] then [res1]… else [default] end 如果exper的值等于val1,返回res1,… 否则返回default默认值

(1)案例:统计班级各个学员的成绩,展示的规则如下: >=85,展示优秀 >=60,展示及格 否则展示不及格

create table score(
id int comment 'ID',    # comment后面加注释
name varchar(20) comment '姓名',
math int comment '数学',
english int comment '英语',
chinese int comment '语文'
) comment '学员成绩表';
insert into score(id,name, math,english,chinese) values (1,'Tom',67,88,95 ),(2,'Rose',23,66,90),(3,'Jack',56,98,76);select id,name,(case when math>=85 then '优秀' when math>=60 then '及格' else '不及格' end) as '数学',(case when english>=85 then '优秀' when english>=60 then '及格' else '不及格' end) as '英语',(case when chinese>=85 then '优秀' when chinese>=60 then '及格' else '不及格' end) as '语文'from score;

相关内容

热门资讯

更新系统安卓系统会更新吗,体验... 亲爱的手机用户们,你是不是也和我一样,时不时地收到手机上那个小小的更新提示呢?没错,就是那个让你有点...
安卓新系统怎么布局好看,打造视... 你有没有发现,每次安卓系统更新,总有些小伙伴兴奋地跑来问我:“新系统怎么布局才好看啊?”这不就是今天...
win10安卓5.1系统,跨界... 亲爱的读者们,你是否曾想过,在Windows 10的强大平台上,也能体验到安卓5.1系统的流畅与便捷...
安卓系统怎么会卡,安卓系统卡顿... 手机用久了,是不是发现安卓系统越来越卡?这可真是让人头疼的问题啊!今天,就让我来带你一探究竟,揭开安...
安卓系统怎么打开deb文件,安... 你是不是也遇到了这样一个问题:手机里下载了一个超酷的安卓应用,结果发现是个deb文件,这可怎么办呢?...
彻底脱离安卓系统的软件,纯国产... 你有没有想过,手机里的世界其实可以不完全是安卓的天下?想象如果你能彻底摆脱安卓系统的束缚,那会是怎样...
安卓系统软件隔离独立,构建安全... 安卓系统的软件隔离与独立:探索安全的数字世界在数字化时代,智能手机已经成为我们生活中不可或缺的一部分...
标致301安卓系统下载,下载与... 你有没有想过,你的标致301汽车竟然也能升级到安卓系统?没错,就是那个我们日常使用的安卓系统!今天,...
安卓系统推荐平板吗华为,安卓系... 你有没有想过,为什么安卓系统那么受欢迎,而华为的平板又那么火呢?今天,就让我带你一探究竟,看看安卓系...
华为买的安卓系统么,引领安卓生... 你有没有想过,华为的手机里到底是不是安卓系统呢?这个问题,估计不少手机迷都好奇过吧!今天,就让我带你...
安卓用什么手机系统最好,安卓系... 你有没有想过,安卓手机的世界里,哪个系统才是最棒的?是不是每次打开手机,都感觉有点乱糟糟的,不知道该...
yun系统如何刷安卓版,轻松实... 你有没有想过,你的安卓手机其实可以变得更加智能和强大呢?没错,就是通过刷入yun系统!听起来是不是有...
mac系统模拟安卓手机系统软件... 亲爱的读者们,你是否曾想过在Mac系统上也能体验到安卓手机系统的乐趣呢?没错,今天就要来跟你聊聊这个...
鸿蒙系统对比安卓的优点 你知道吗?最近手机圈里可是热闹非凡呢!各大品牌纷纷推出自家的新款手机,而其中最引人注目的,莫过于华为...
固态硬盘修复教程安卓系统,安卓... 你的安卓手机固态硬盘突然罢工了?别慌张,今天就来教你几招,让你的硬盘重焕生机!一、检查连接线是否松动...
手机装虚拟安卓系统教程,手机安... 你有没有想过,你的手机可以变成一个多才多艺的小戏精,既能装Windows,又能玩安卓?没错,这就是今...
安卓系统平板电脑屏幕暗,打造舒... 你是不是也遇到了这样的烦恼?你的安卓系统平板电脑屏幕突然暗了下来,亮度调节按钮也似乎失灵了。别急,让...
安卓高清系统推荐电脑版,打造极... 你有没有想过,手机上的安卓高清系统竟然也能搬到电脑上?没错,就是那种流畅、美观,还能让你在电脑上也能...
自己刷安卓盒子系统,功能、操作... 你有没有想过,家里的安卓盒子系统是不是该来个焕然一新的大变身呢?别急,让我带你一步步走进自己刷安卓盒...
安卓系统的空格怎么输入,探索安... 你是不是也和我一样,在使用安卓手机的时候,有时候会遇到一个让人头疼的问题——怎么输入空格呢?别急,今...