当前位置:网站首页>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): 該語句添加一個主鍵,這意味著索引值必須是唯一的,且不能為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删除,重啟

原网站

版权声明
本文为[唐僧騎白馬]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/187/202207060930356295.html