当前位置:网站首页>mysql高級(索引,視圖,存儲過程,函數,修改密碼)
mysql高級(索引,視圖,存儲過程,函數,修改密碼)
2022-07-06 17:25: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删除,重啟
边栏推荐
- Resume of a microservice architecture teacher with 10 years of work experience
- Activiti directory (V) reject, restart and cancel process
- Shawshank's sense of redemption
- Brush questions during summer vacation, ouch ouch
- CentOS7上Redis安装
- Akamai talking about risk control principles and Solutions
- Final review of information and network security (full version)
- JVM garbage collector part 1
- 信息与网络安全期末复习(基于老师给的重点)
- MySQL数字函数
猜你喜欢
02个人研发的产品及推广-短信平台
8086 CPU internal structure
应用服务配置器(定时,数据库备份,文件备份,异地备份)
JVM class loading subsystem
ByteDance overseas technical team won the championship again: HD video coding has won the first place in 17 items
07个人研发的产品及推广-人力资源信息管理系统
Final review of information and network security (based on the key points given by the teacher)
华为认证云计算HICA
JVM之垃圾回收器下篇
Install docker under windows10 (through Oracle VM VirtualBox)
随机推荐
[reverse] repair IAT and close ASLR after shelling
Instructions for Redux
On the clever use of stream and map
Redis quick start
MySQL digital function
Assembly language segment definition
JVM 垃圾回收器之Serial SerialOld ParNew
8086 内存
肖申克的救赎有感
06个人研发的产品及推广-代码统计工具
Mongodb learning notes
Koa Middleware
Shawshank's sense of redemption
【逆向】脱壳后修复IAT并关闭ASLR
Learn the wisdom of investment Masters
Activiti directory (III) deployment process and initiation process
Activit fragmented deadly pit
Junit单元测试
Activit零零碎碎要人命的坑
MySQL date function