当前位置:网站首页>mysql高级(索引,视图,存储过程,函数,修改密码)
mysql高级(索引,视图,存储过程,函数,修改密码)
2022-07-06 09:34:00 【唐僧骑白马】
索引
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): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
ALTER 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删除,重启
边栏推荐
猜你喜欢
随机推荐
Jetpack compose 1.1 release, based on kotlin's Android UI Toolkit
Akamai anti confusion
Eight part essay that everyone likes
Flink源码解读(一):StreamGraph源码解读
1. Introduction to JVM
Login to verify the simple use of KOA passport Middleware
PostgreSQL 14.2, 13.6, 12.10, 11.15 and 10.20 releases
Instructions for Redux
Idea resolving jar package conflicts
Idea breakpoint debugging skills, multiple dynamic diagram package teaching package meeting.
Wu Jun trilogy insight (IV) everyone's wisdom
The difference between URI and URL
Flink 解析(五):State与State Backend
JUnit unit test
Akamai 反混淆篇
唯有學C不負眾望 TOP5 S1E8|S1E9:字符和字符串&&算術運算符
Flink parsing (VI): savepoints
暑假刷题嗷嗷嗷嗷
MySQL date function
C#版Selenium操作Chrome全屏模式显示(F11)