mysql高级(索引,视图,存储过程,函数,修改密码)

索引

  mysql的索引就如同字典的目录页(索引)一样,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。
  索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。
创建索引时,你需要确保该索引是应用在SQL 查询语句的条件(一般作为 WHERE 子句的条件)。实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
  虽然建立索引可以加快数据检索的速度,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。

普通索引

  • 查看索引
show index from 表名;
  • 创建索引

方式一:建表时创建索引

 CREATE TABLE create_index(
 id INT PRIMARY KEY,
 NAME VARCHAR(10) UNIQUE,
 age INT,
 INDEX age_index(age)
 );

方式二:对于已经存在的表,添加索引

//如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致
//字段类型如果不是字符串,可以不填写长度部分
create index 索引名称 on 表名(字段名称(长度))
例:
create index age_index on create_index(age);
create index name_index on create_index(name(10));
  • 删除索引
drop index 索引名称 on 表名;
  • 开启运行时间监测
set profiling=1;
  • 查看执行的时间
show profiles;
  • 修改表结构(添加索引)
ALTER table tableName ADD INDEX indexName(columnName)
ALTER TABLE create_index ADD INDEX name_index(NAME(10))

唯一索引
  与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

  • 创建唯一索引
CREATE UNIQUE INDEX indexName ON mytable(username(length)) 
CREATE UNIQUE INDEX name_index2 ON create_index(name(10))
  • 修改表结构创建唯一索引
ALTER table mytable ADD UNIQUE [indexName] (username(length));
ALTER TABLE create_index ADD UNIQUE name_index3(name(10));
  • 创建表的时候直接指定
CREATE TABLE create_index(  
ID INT NOT NULL,   
name VARCHAR(16) NOT NULL,  
UNIQUE [indexName] (username(length))  
);  
  • 使用ALTER 命令添加索引
//有四种方式来添加数据表的索引:
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULLALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。

视图

  对于复杂的查询,在多个地方被使用,如果需求发生了改变,需要更改sql语句,则需要在多个地方进行修改,维护起来非常麻烦。
解决:定义视图
视图本质就是对查询的封装,定义视图,建议以v_开头
语法:

create view 视图名称 as select语句;
  • 例:创建视图,查询学生对应的成绩信息
create view v_stu_score_course as
select
stu.*,cs.courseNo,cs.name courseName,sc.score
from
students stu
inner join scores sc on stu.studentNo = sc.studentNo
inner join courses cs on cs.courseNo = sc.courseNo

CREATE VIEW v_stu AS
SELECT
name,sex
FROM
students
//使用视图
SELECT * FROM v_stu
  • 查看视图:查看表会将所有的视图也列出来
show tables;
  • 删除视图
drop view 视图名称;
例:
drop view v_stu_score_course;
  • 使用视图:视图的用途就是查询
select * from v_stu_score_course;
SELECT * FROM v_stu

存储过程

  存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。

优点

  • 存储过程可封装,并隐藏复杂的商业逻辑。
  • 存储过程可以回传值,并可以接受参数。
  • 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
  • 存储过程可以用在数据检验,强制实行商业逻辑等。

缺点

  • 存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
  • 存储过程的性能调校与撰写,受限于各种数据库系统。
  • 语法:
delimiter $$
create procedure 存储过程名称(参数列表)
begin
sql语句
end$$
delimiter ;
  • 说明: delimiter用于设置分割符,默认为分号
  • 解析:默认情况下,存储过程和默认数据库相关联,如果想指定存储过程创建在某个特定的数据库下,那么在过程名前面加数据库名做前缀。在定义过程时,使用 DELIMITER $$ 命令将语句的结束符号从分号 ; 临时改为两个$$,使得过程体中使用的分号被直接传递到服务器,而不会被客户端(如mysql)解释。
  • 例子:
    要求:创建查询过程,查询学生信息
  • step1:设置分割符
delimiter $$
  • step2:创建存储过程
create procedure proc_stu()
begin
select * from students;
end$$
  • step3:还原分割符
delimiter ;
  • 调用语法:
call 存储过程(参数列表);
调用存储过程proc_stu
call proc_stu();

函数

  • 创建函数语法
delimiter $$
create function 函数名称(参数列表) returns 返回类型
begin
sql语句
end
$$
delimiter ;
  • 函数示例
    要求:创建函数my_trim,用于删除字符串左右两侧的空格
  • step1:设置分割符
delimiter $$
  • step2:创建函数
create function my_trim(str varchar(100)) returns varchar(100)
begin
return ltrim(rtrim(str));
end
$$
  • step3:还原分割符
delimiter ;
  • 使用自定义函数
select ' abc ',my_trim(' abc ')
  • 总结:
  • 存储过程和函数都是为了可重复的执行操作数据库的 sql 语句的集合.
  • 存储过程和函数都是一次编译,就会被缓存起来,下次使用就直接命中缓存中已经编译好的 sql,不需要重复编译
  • 减少网络交互,减少网络访问流量

修改密码

说明:修改user表的密码就是修改数据库的密码

  • 使用root登录,修改mysql数据库的user表
  • 使用password()函数进行密码加密
  • 注意修改完成后需要刷新权限
use mysql;
update user set password=password('新密码') where user='用户名';
例:
update user set password=password('123') where user='root';
刷新权限: flush privileges;

忘记 root 账户密码
1、配置mysql登录时不需要密码,修改配置文件

  • Centos中:配置文件位置为/data/server/mysql/my.cnf
  • Windows中:配置文件位置为C:\Program Files (x86)\MySQL\MySQL Server 5.1\my.ini修改,找到mysqld,在它的下一行,添加skip-grant-tables
[mysqld]
skip-grant-tables

2、重启mysql,免密码登录,修改mysql数据库的user表

use mysql;
update user set password=password('新密码') where user='用户名';
例:
update user set password=password('123') where user='root';
刷新权限: flush privileges;

3、还原配置文件,把刚才添加的skip-grant-tables删除,重启

发布了56 篇原创文章 · 获赞 50 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43883625/article/details/99637316