当前位置:   article > 正文

MySQL操作+增删改查_mysql创建账非root账号 授权select update

mysql创建账非root账号 授权select update

目录

三.用户的操作        

1.创建用户

2.查看用户

3.用户赋权

4.查看权限

5.收回权限

6.修改用户名

7.修改用户密码

8.删除用户

9.创建可以远程连接的用户

四. 数据表操作

5. 常见的数据类型及约束

五、==SQL==

1. 数据表操作

创建表

查看表结构

备份表--备份数据,不备份部分约束

改表名

删除表

2. 数据的增删改

插入数据

删除数据

修改数据

3. 基础查询

4.逻辑查询

5.比较运算

6.范围查询

7.模糊查找

8.边界值查询

9.空值查找

10. 去重查询

11. 查询排序        

12.日期查找

13. 聚合函数

14.多表查找

14.1 笛卡尔积

14.2 内连接

14.3 外连接--左连接

14.4 外连接--右连接

15.分组查询

16. 子查询

练习

六、高级操作

1. 命令行的使用

2. 备份与恢复

3. 存储过程

4. 视图

5. 事务         

6. 索引

命令行中文乱码


.用户的操作        

1.创建用户

create user ' 用户名 '@'ip 地址 ' identified by ' 密码 ';
解释 :
1. 用户名 ,ip 地址 , 密码 都要用英文的单引号引起来
2. 句子结尾用英文的分号 ; 表示结束
3. 每一个单词之间有空格
SQL: 数据结构查询语言
举例 :
create user 'abc'@'192.168.0.113' identified by 'tashi123';

2.查看用户

select * from user;

3.用户赋权

grant 权限 1, 权限 2 on *.* to ' 用户名 '@'ip 地址 ';
权限 :create, insert ,delete,update,select,drop
第一个 * 表示数据库 , 泛指所有 ,
第二个 * 指数据库里面所有的表
to : 表示给与的对象
举例 :
grant create, insert ,delete,update,select,drop on *.* to 'abc'@'192.168.0.113';
-- abc 用户赋予创建 , 增删改查 ,drop 的权限

4.查看权限

show grants for ' 用户名 '@'ip 地址 ';
举例 :
show grants for 'abc'@'192.168.0.113'; --- 查看 abc 的权
也可以使用 :select * from user ; 通过列表查看用户权限

5.收回权限

revoke 权限 1, 权限 2 on *.* from ' 用户名 '@'ip 地址 ';
举例 :
revoke select on *.* from 'abc'@'192.168.0.113'; --- 收回 abc
shutdown 的权限

6.修改用户名

rename user ' 旧用户名 '@'ip 地址 ' to ' 新用户名 '@'ip 地址 ';
举例 :
rename user 'abc'@'192.168.0.113' to 'aaa'@'192.168.0.113'; --
修改 abc 名字为 aaa

7.修改用户密码

set password for ' 用户名 '@'ip 地址 '=password(' 新密码 ');
举例 :
set password for 'aaa'@'192.168.0.113'=password('abc123'); --
修改 aaa 的密码为 abc123

8.删除用户

drop user ' 用户名 '@'ip 地址 ';
举例 :
drop user 'aaa'@'192.168.0.113'; -- 删除用户 aaa

9.创建可以远程连接的用户

1. navicate 创建用户 create user 'abc'@'%' identifified by
'tashi123'; -- 创建 abc 适用于任何 ip
2:grant all PRIVILEGES on * . * to 'abc'@'%';
3. 刷新权限 :flflush privileges;
4. 可以在 navicate 上远程登录
例子 :
create user 'jen'@'%' identifified by '123456';
mysql -uroot -p123456
grant all privileges on * . * to 'jen'@'%'; -- 注意 * 后面无空格
flflush privileges;

. 数据表操作

5. 常见的数据类型及约束

为了更加准确的保存数据,保证数据的有效性,需要合理的使用数据的类型以及约束来限制数据的存储。
「常用的数据类型」
整数( int :有符号范围 [-2147483 648 2147483 647] ,无符号 [0 4294967295]
默认 unsigned
小数( decimal :如 decimal(5, 2) 表示该小数一共有 5 位,小数占 2 位,整数占 3
字符串( varchar :范围( 0-65535 ),如 varchar 3 ),表示最多可以存 3 个字符,中文与字母都是占一个
char(n) : 定长字符类型 , 字符长度固定为 n, 不足长度的用空格补齐 --- 浪费资源
日期时间( datetime :如 2020-04-02 15:04:05
日期( date :如 2020-04-02
「常见的约束」:
主键( primary key :物理存储上的顺序,用来标识唯一的一行数据 , 非空 , 唯一
非空( not null :此字段不允许填空值(
不能不填)
唯一( unique :此字段的值不允许重复
默认值( default :此字段可以不填,不填时使用默认值
外键( foreign key :维护两张表之间的关系(一张表的字段是另外一张表的主键)【了解】

五、==SQL==

1. 数据表操作

创建表

格式:
create table 表名 (
字段名 1 类型 约束 ,
字段名 2 类型 约束 ,
... ...
);
1
-- 创建一张学生表,里面包含 id 主键,姓名 非空,年龄,性别 4 个字段
create table students(
id int primary key ,
name varchar ( 10 ) not null ,
age int ,
sex varchar ( 2 )
);
2
-- 创建一张英雄表,里面包含 id (主键),姓名( 4 ),身高(保留 1 位小数)
create table heros(
id int primary key auto_increment, -- 自增
name varchar ( 10 ),
height decimal ( 5 , 1 )
);
3: (了解)
drop table if exists class_info;
drop table if exists student_info;
create table student_info(
id int primary key,
name varchar(10),
sex char(2)
);
create table class_info(
class_id int primary key,
stu_id int,
class_name varchar(10),
foreign key(stu_id) references student_info(id)
);
插入数据要先插入主表 student_info ,再插入从表 class_info
insert into student_info values(1,' 1',' '); --ok
insert into class_info values(1,1,'Linux'); --ok
insert into class_info values(2,2,'Web'); --not ok
insert into student_info values(2,' 2',' '); --
删除表的时候,先删除从表,在删除主表;
drop table class_info;
drop table student_info;

查看表结构

desc 表名 ;
举例 :
desc heros; --- 查看 st 表的表结构 heros

备份表--备份数据,不备份部分约束

create table 新表 as (select * from 旧表 );
举例 :
create table stt as (select * from st);-- st 表备份为 stt

改表名

rename table 旧表名 to 新表名 ;
举例 :
rename table st2 to student2; -- st2 表改名为 student2;

删除表

直接删除(表不存在的话会报错)

drop table 表名 ;
先判断再删除(表不存在不会报错)
drop table if exists heros2;
清空表(截断表)
truncate table 表名 ;
举例 :
truncate table student; -- 清空学生表
delete truncate ,drop 的区别
drop: 删除表 , 表结构和表数据一起删除
truncate: 清空表 , 只清空数据 , 表结构还在
delete: 只删除数据
truncate delete 的区别 :
1.truncate 是一次性删除所有数据 ,
delete 可以准确的删除某一部分或者某一条数据
2. 数据量超过 1000, 使用 truncate 较好
数据量较少 , 使用 delete
3. 工作中用的较多的是 delete, 如果要清空整张表 , 才会用 truncate

2. 数据的增删改

插入数据

全量插入 :字段与插入数据数量必须相等
格式 insert into 表名 values ( 1, 2...);
:在学生表中插入一条数据
-- 创建学生表
create table stu(
id int primary key ,
name varchar ( 10 ) not null ,
age int ,
sex varchar ( 2 )
);
全量插入数据
insert into stu values ( 1 , " 张三 " , 18 , " " ); -- 字段与插入数据数量必须相等
部分插入 :对于没有「 not null 」约束的字段可以选择性插入
格式 insert into 表名 ( 字段 1, 字段 2...) values ( 1, 2...);
:在学生表中插入一条数据,只插入前面两个字段
insert into students(id, name) values ( 2 , " 李四 " );
批量插入
格式一 :在 values 后面写多个插入的数据,每个数据间,用逗号隔开
insert into 表名 values
(),(),()...;
:在学生表中同时插入 2 条数据
insert into students values ( 3 , " 王五 " , 19 , " " ),( 4 , " 赵六 " , 23 , " " ); -- 批量 + 全量
insert into students(id, name) values ( 5 , " 小五 " ),( 6 , " 小六 " ); -- 批量 + 部分
格式二 :写多个「 insert
insert into students values ( 7 , " 小七 " , 45 , " " );
insert into students values ( 8 , " 小八 " , 25 , " " );

删除数据

格式
delete from 表名 where 条件 ;
:在学生表中,删除名字 id 7 的学生的信息
delete from student where studentid= 7 ;

修改数据

格式
语法 :
update 表名
set = 值,列 2= 2
where 条件 ;
--update 修改 , 更改 , 更新的意思
--set 设置 , 赋值的意思 , 要修改的内容
--where 表示修改的位置 , 即在哪里修改 . 后面跟限定 ( 筛选 ) 条件
:将学生表中 id 1 的学生的性别为
update student set sex= ' ' where studentid= 1 ;
简单查询
查询表中所有数据
select * from student;

3. 基础查询

「查询所有」
select * from student;
「查询指定字段」
-- 查询学生表中所有人的性别
select sex from student;
-- 给字段取别名
select studentid as ' 学生编号 ' , sname as ' 姓名 ' from student;
-- 给表取别名 ( 单表时不明显 )
select s .sname ,s .studentid from student as s;

4.逻辑查询

and :并且的意思,经过and 筛选数据越来越少--要求条件都满足才显示,and优先级高于or,通常使用小括号进行提高优

先级
or : 或者的意思 , 经过 or 的筛选数据越来越多 -- 只要满足其中一个就可以了
not : 否定的意思
优先级 : not > and > or -- 混用时 , 要用小括号提高优先级
eg:
-- 查找学号为 4 的或者性别为女的学生信息
select * from student where studentid=4 or sex=' ';
-- 查找学生表中 3 班的男生 和 4 班的女生学生信息
select * from student where (classid=3 and sex=' ') or (classid=4 and sex=' ');
-- 查找性别为男生或者女生 , 且学号小于等于 10 的学生信息
select * from student where (sex=' ' or sex=' ') and studentid < 10 ; ok
select * from student where sex=' ' or sex=' ' and studentid < 10 ; not ok

5.比较运算

> : 大于
< : 小于
>= : 大于等于
<= : 小于等于
!= : 不等于
<>: 不等于
语法 :select * from 表名 where > ;

6.范围查询

in () : ... 里面 , 括号里面是一个个的
not in (): 不在 ... 里面 , in 相反
select * from student where sname in (' 刘东 ',' 王红达 ');
select * from student where sname not in (' 刘东 ',' 王红达 ');

7.模糊查找

like : ....
%: 代表 [0,~) --- 最少代表 0 个字
_: 代表 1 个字
模糊查找分类 :
前模糊 : %
后模糊 : %
前后模糊 : %
select * from student where sname like ' %';

8.边界值查询

between A and B: 某一列的值在 A B 之间 , 包含 A B , 也就是 列 >=A
and <=B;
查询学号 1 5 的学生信息 :
select * from student where studentid between 1 and 5;

9.空值查找

空值 :null -- 空值不等于任何值
要注意 在 update 语法的 set 后面 要使用 = , 因为 set 后面的 = 是赋值 , 不是判断
is null : 是空值
is not null : 非空值
select * from student where sex is null;
select * from student where sex is not null;

10. 去重查询

select 后查询字段前使用 distinct 可以查询出消除重复行后的结果
select distinct sname from student;
注意:使用 distinct 对多个字段去重查询时,只有多个字段组合值重复时,才会去重,反之不会。
select distinct studentid from student ;
select distinct sname,sex from student ;

11. 查询排序        

关键字: order by
升序: asc (默认升序)
降序: desc
1 查询所有学生的信息,并且按照学号从小到大排序
select * from student order by studentid asc ;
2 查询 5 班女生且学号小于 50 的学生信息 , 按照学号升序排列
select * from student where classid= 6 and sex= ' ' and studentid< 50 order by studentid;
查询所有学生信息,按照生日从小到大排序 , 如果出生日期相同时 , 再按照班级号从小到大排序
select * from student order by birthday , classid ;
查询学生表中学号在 1- 10 之间 ( 包含 1 不包含 10), 且姓名为三个字 , 年龄大于等于蔡学森同学的同学信息 , 按照学号降序
排列 ,[ 蔡学森同学的生日是 2013 - 07 - 14 10 :31:57 ]
select * from student where studentid < 10 and studentid >= 1 and sname like '___' and
birthday <= '2013-07-14 10:31:57' order by studentid desc ;

12.日期查找

datetime :YYYY-MM-DD HH:mm:ss
-- 查询系统时间
select now();
-- 查询 2013-11-06 10:31:57 出生的人 -- 查找具体时间点
select * from student where birthday='2013-11-06 10:31:57';
-- 查询模糊时间 , 比如 : 截取日期的部分取值
select * from student where year(birthday)='2013'; --
年份查找
select * from student where month(birthday)='2'; --
月份查找
select * from student where day(birthday)='12' ; -- 按日期查找
select * from student where dayofmonth(birthday)='12' ; --
-- 组合查找
DATE_FORMAT( 日期的列 ,' 日期格式 ') -- %Y-%m-%d %H:%i:%s
-- 按 年 + 月 组合查找
select * from student where date_format(birthday,'%Y-%m')='2014-05';
-- 按 月 + 日期 组合查找
select * from student where date_format(birthday,'%m-%d')='05-12';
-- 按 年 + + 日 组合查找
select * from student where date_format(birthday,'%Y-%m-%d')='2014-05-12';
-- 按 年 + + + + + 秒 进行查找
select * from student where date_format(birthday,'%Y-%m-%d %H:%i:%s')='2013-07-14 10:31:57'; -- %Y-%m-
%d

13. 聚合函数

MySQL 预设的一些函数,可以快速实现「数据统计」
count
计算总行数
例: 查询学生表中总共有多少个学生
select count (*) as 学生总数 from student;
max
统计最大值
例: 查询学生表中最大的学号
select max(studentid) from student;
min
统计最小值
例: 查询 3 班的最小学号
select min(studentid) from student where classid= 3 ;
sum
求此列的和
例: 查询学号的和
select sum(studentid) from student;
avg
求此列平均值
例: 查询女生的平均学号
select avg(studentid) from student where sex= ' ' ;
select round(avg(studentid), 2 ) from student where sex= ' ' ; -- 保留两位学号

14.多表查找

分类 :
笛卡尔积
等值连接
内连接
外连接 : 左连接 右连接

14.1 笛卡尔积

定义 : 两张表中的数据做乘法
备注 : 一般不使用笛卡尔积 , 因为会产生无效的垃圾数据

14.2 内连接

内连接 : 找出两张表中有共同关联的数据 , 叫做内连接 ----- 等同于等值连接
语法 :
select
from 1
inner join 2
on 1. = 2.
where 条件 ; -- 内连接
语法 :
select
from 1 , 2
where 1. = 2. -- 等值连接
-- 解题思路 :
1. 找出表和表之间的关联字段
2. 把题目中所有信息分发到表中 , 确定需要使用到哪些表 , 找出关联字段进行表关联 , 之后和单表查询类似 , 注意各种条 件,and or 的使用等
-- 查找出所有的学生信息 , 包含学生的姓名和班级名称等信息
select *
from student st,class cl
where st.classid=cl.classid;
-- 查找 527 班的学生信息
select *
from student st,class cl
where st.classid=cl.classid
and cname='527';
-- 找出 刘姓 , 女同学的考试成绩和姓名
select sname,score
from student st,score sc
where st.studentid=sc.studentid
and sname like ' %'
and sex=' ';
-- 找出考试及格的学生的姓名 , 班级 id 和分数
select sname,classid,score
from student st,score sc
where st.studentid=sc.studentid
and score>=60;
-- 找出 linux 考试及格的学生的学号和成绩
select studentid,score
from score sc,course co
where sc.courseid=co.courseid
and coname='linux'
and score>=60;
-- 找出 527 班学生的学号和考试成绩 ( 当找的内容和条件在两张表 , 无法关联时 , 要借用第三张表 )
select sc.studentid,score
from class cl,student st,score sc
where cl.classid=st.classid
and st.studentid=sc.studentid and cname=527;
-- 找出 Linux 考试及格的学生的姓名 , 班级名称和成绩
select sname,cl.cname,score
from class cl,student st,score sc,course co
where cl.classid=st.classid
and st.studentid=sc.studentid
and sc.courseid=co.courseid
and co.coname='Linux'
and score>=60;
select st.sname,cl.cname,sc.score from class cl inner join student st on
cl.classid=st.classid
inner join score sc on st.studentid=sc.studentid inner join course co
on sc.courseid=co.courseid where coname='Linux' and sc.score>=60;

14.3 外连接--左连接

左连接 : 在内连接的基础上 , 找出左边表有 , 而右边表没有的数据 , 右边表没有的数据用
null 表示 .
A left B :A 是主表
B left A :B 是主表
select * from student2 st left join class2 cl on
st.classid=cl.classid;
select * from student2 st right join class2 cl on
st.classid=cl.classid;

14.4 外连接--右连接

右连接 : 在内连接的基础上 , 找出右边表有 , 而左边表没有的数据 , 左边表没有的数据用
null 表示 .
A right B :B 是主表
B rigth A :A 是主表
select * from class2 cl left join student2 st on
st.classid=cl.classid;
select * from class2 cl right join student2 st on
st.classid=cl.classid;
-- 查找没有学生的班级名称
-- 分析 : 有班级里面没有学生 --- 班级表有数据 ( 主表 ), 学生表没有数据 ( 从表 )
-- 左连接 :
select cname from class2 cl left join student2 st on
st.classid=cl.classid
where st.studentid is null;
-- 右连接 :
select cname from student2 st right join class2 cl on
st.classid=cl.classid
where st.studentid is null;
-- 查找出没有班级名称的学生姓名 ( 学生表有 , 班级表没有 )
-- 左连接 :
select sname from student2 st left join class2 cl on
st.classid=cl.classid where cl.classid is null;
-- 右连接 :
select sname from class2 cl right join student2 st on
st.classid=cl.classid where cl.classid is null;

15.分组查询

-- 什么情况下要分组 ?
: 当所求的结果存在多个分类的时候 , 就要分组 . 一般当出现 : 每个 每种 , 不同
之类的词就要分组
语法 :
select 分组的列 , 聚合函数
from 表名
where 分组前条件
group by 分组的列
having 分组后聚合条件
order by asc /desc;
--select 后面的 分组的列 跟 group by 后面的必须保持一致
-- 聚合函数只能放在 having 分组后的条件里面 , 不能放在 where 后面
--order by 永远放在 SQL 语句的最后面
-- 求学生表中男女生的人数
select sex, count(*)
from student
group by sex ;
-- 2 班男生女生的人数
select sex,count(*)
from student
where classid=2 -- 分组前筛选 , 确保数据的正确性 , 减少数据量
group by sex ;
-- 求每个班男生女生的人数 -- [ 多列分组 , 了解 ]
先全校学生在操场上 , 如果实现上述查询 , 则首先把各个班混在一起的学生按照班级进行分 , 在按照性别进行分 , 即按照班级
和性别进行分组
select classid,sex,count(*)
from student
group by classid,sex; -- 多个分组的列 ( 仅作为了解 )
-- 求每个班的人数 , 要求总人数超过 9 的班级才会显示
select classid,count(*)
from student
group by classid
having count(*)>9; -- 分组后筛选
-- 求学生表中学号在 5-60 之间 , 包含 5 60, 每个班学生的人数 , 要求总人数超过 5,
按照人数多少排序
select classid,count(*)
from student
where studentid>=5
and studentid<=60
group by classid
having count(*)>5
order by count(*) desc;
-- 求学生表中重名的姓名和数量
select sname,count(*)
from student
group by sname
having count(*)>1;
多表分组 :
select 分组的列 , 聚合函数
from 1, 2
where 1. = 2.
and 分组前条件
group by 分组的列
having 分组后聚合条件
order by asc /desc
limit 起始位置 , 数几个 ;
-- oracle 考试及格的每个班学生的人数
01 20
02 30
select classid,count(*)
from student st,score sc,course co
where st.studentid=sc.studentid
and sc.courseid=co.courseid
and coname='oracle'
and score>=60
group by classid ;
-- 527 班考试及格的男生女生的人数
select sex,count(*)
from class cl,student st,score sc
where cl.classid=st.classid
and st.studentid=sc.studentid
and cname='527'
and score>=60
group by sex ;
-- 求每个班级的最高分和最低分 , 要求最低分要超过 25
select classid,max(score) ,min(score)
from student st,score sc
where st.studentid=sc.studentid
group by classid
having min(score)>25;
-- 求每门课程 ( linux/oracle ) 都及格的学生的学号和最低分 [*****]
select sc.studentid,min(sc.score) from course co,score sc where
co.courseid=sc.courseid group by sc.studentid having min(score)>=60;
-- 查找每个班考试及格的男生的班级名称 , 人数 . 要求人数超过 3 , 并按照人数升序
排序
select cname,count(distinct(st.studentid))
from class cl,student st,score sc
where cl.classid=st.classid
and st.studentid=sc.studentid
and sex=' '
and score>=60
group by cname
having count(distinct(st.studentid))>3
order by count(distinct(st.studentid));

16. 子查询

「定义」 :在一个 select 中嵌入另外一个 select ,这就是子查询
一般情况下,第一个 select 是「主查询」
子查询一般充当数据源
子查询是可以独立存在,是一条完整的查询语句
1 查询年龄大于蔡学森同学的学生的信息(返回一个数据, 标量子查询
-- 首先查出蔡学森同学的出生日期
-- select birthday from student where sname=' 蔡学森 ';
-- 然后查询大于蔡学森年龄的学生信息
-- select * from student where birthday<'2013-07-14 10:31:57';
-- 组合成子查询
select * from student where birthday<( select birthday from student where sname= ' 蔡学森 ' );
2 查询蔡学森的成绩(返回一个数据,标量子查询)
首先查询出蔡学森的学号
-- select studentid from student where sname=" 蔡学森 ";
-- 然后再拿着查到的学号去查询成绩
-- select score from score where studentid=1;
-- 组合成子查询
select score from score
where studentid=( select studentid from student where sname= " 蔡学森 " );
3 查询姓张或姓刘学生的成绩(返回一列数据, 列子查询
多表关联
select sc .score from student st,score sc where
st .studentid =sc .studentid and (st .sname like ' %' or st .sname like ' %' );
子查询
select score from score where studentid in ( select studentid from student
where sname like ' %' or sname like ' %' );
limit 用法」
查询时,用于返回前几条或中间几条 数据
接受两个参数:第一个是「起始值」,第二是「返回数目值」。注意起始值是从 0 开始的!
例:
查询学号最大的男生的信息
select * from student where sex= " " order by studentid desc limit 0 , 1 ; -- 起始值 0 ,可以
省略不写
4 查询 Linux 课程的成绩(返回多行多列数据, 表子查询
-- 首先查出 Linux 课程的 courseid
-- select * from course where coname in ("Linux");
-- 然后拿着查到的课程编号去成绩表查询成绩
-- select score from score where courseid in (1);
-- 组合成子查询(列子查询)
-- select score from score where courseid in (select courseid from course where coname in
( "Linux" ));

练习

1. 修改
-- 527 班所有同学的成绩加 10
update score
set score=score+ 10
where studentid in ( select st .studentid from class cl,student st
where cl .classid =st .classid and cl .cname = 527 );
2. 删除
-- 删除蔡学森同学的成绩记录
select * from score where studentid=1;
delete
from score
where studentid=(select studentid from student where sname=' 蔡学森 ');
select * from score where studentid=1;

六、高级操作

1. 命令行的使用

登录数据库: mysql - uroot - p123456
查看所有数据仓库: show databases ;
使用某个数据库: use 仓库名 ;
查看当前使用的仓库: select database() ;
创建数据库: create database 仓库名 charset=utf8;
删除数据库: drop database 仓库名 ;

2. 备份与恢复

「备份」
1. 用「管理员」用户打开命令行窗口
2. 输入备份命令
mysqldump -uroot -p123456 mysql > mysql_bak .sql -- linux
-- mysql 是需要备份的数据仓库名字
-- mysql_bak.sql
「恢复」
1. 登录「 MySQL 」,创建一个新的数据仓库去接收之前备份数据文件
2. 以「管理员」身份运行命令行,输入恢复命令
mysql -uroot -p123456 新数据仓库名字 < 备份文件存放的路径
--
mysql -uroot -p123456 tashi_bak < mysql_bak .sql -- linux

3. 存储过程

「定义」 :存储过程也叫存储程序,它是一条或者多条 SQL 的集合
「创建存储过程」
delimiter //
create procedure test_pro() -- test_pro 是一个存储过程的名字
begin
select * from student; -- 这里写 SQL 语句
end
//
「调用存储过程」
call 存储过程名 ()
--
call test_pro()
「总结」
存储过程其实就是一个「可重复执行」的 SQL 语句的集合
存储过程只需编译一次,然后被缓存起来,下次直接运行
存储过程可以减少网络交互,减少网络访问量

4. 视图

「定义」 :本质上是对查询的封装,对于经常需要在多个地方「重复」使用的查询语句,可以将其定义成「视图」,
方便使用。
「创建视图」
create view 视图名称 as 查询语句 ;
--
create view test_view as select * from student order by studentid desc ;
「查看视图」
show tables;
注意:查看视图与查看表格是同一命令,所以在创建视图时,尽量使用特定的标志去标识视图,比如在视图名称前面
加上一个 v (以后看到 v 开头的表格,就知道是一个视图)
「使用视图」:
select * from 视图名称 ;
--
select * from v_test;
「删除视图」:
drop view 视图名称 ;

5. 事务         

「定义」 :事务是一个操作序列,这些操作要么「都执行」,要么「都不执行」
比如一个转账:小明给小方转账 500 块钱,分解步骤:
小明 -500
小方 +500
事务的主要应用场景比如:银行系统,订单系统 ...
SHOW VARIABLES LIKE '%AUTOCOMMIT%';
set autocommit = 0;
「开启事务」 :(在事务中的操作会存在缓存中)
begin ;
「提交事务」: (将缓存中的数据变更到物理表中)
commit
「回滚事务」: (放弃缓存中的数据变更)
rollback;
注意:和事务相关的语句只有 DML 语句( insert delete update

6. 索引

在数据库中建立「索引」,可以大大提高数据查询的速度。
相当于目录
「查看索引」
show index from 表名 ;
一旦表中有主键,那么主键就是索引值
「创建索引」         
-- 方法一:
create table girl (
id int primary key, -- 给某个字段指定为主键,那么该字段就是索引
name varchar ( 10 )
);
-- 方法二:
-- create index 索引名称 on 表名 ( 字段 )
create index id_index on girl(id); -- 手动创建索引
「删除索引」
drop index 索引名称 on 表名 ; -- 索引名称对应 key_name
「案例」
1. 首先创建一张表,并且插入 10w 条数据
2. 打开时间监测: set profiling=1
3. 第一次查询第 10W 条数据: select * from test_index where name="test100000" ;
4. 查看时间: show profiles ;
5. 手动创建索引: create index id_index on test_index(id) ;
6. 第二次查询第 10w 条数据: select * from test_index where name="test100000" ;
7. 第二次查看时间: show profiles ;
-- 索引和存储过程的使用
drop table if exists test;
create table test(
id int,
name varchar(50)
);
drop procedure if exists test_pro;
delimiter //
create procedure test_pro()
begin
set @i=1;
while @i<=10000 do
insert into test values(@i,concat("user",@i));
set @i=@i+1;
end while;
end
//
call test_pro();
select * from test where name='user3';
create index name_index on test(name);
select * from test where name='user3';
「总结」 **
创建索引后在一定程度上会提高数据的查询速度,但同时,每次对数据表进行增删改都需要重建索引,所以也
会对增删改的速度有一些影响
所以,只有在需要大量查询数据的时候,推荐去创建索引。
是否自动提交
SHOW VARIABLES LIKE '%AUTOCOMMIT%';

命令行中文乱码

1. 首先在命令行中登录数据库;
2. 执行如下命令
set character_set_client=utf8;
set character_set_results=utf8;
set character_set_client=gb2312;
set character_set_results=gb2312;
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/717617
推荐阅读
相关标签
  

闽ICP备14008679号