1. 程式人生 > 資料庫 >MySQL整理01

MySQL整理01

一、Linux系統安裝mysql

1.1安裝

  1. 解除安裝 centos 中預安裝的 mysql
    rpm -qa | grep -i mysql
    rpm -e mysql-libs-5.1.71-1.el6.x86_64 --nodeps
  2. 上傳 mysql 的安裝包
    alt + p -------> put E:/test/MySQL-5.6.22-1.el6.i686.rpm-bundle.tar
  3. 解壓 mysql 的安裝包
    mkdir mysql
    tar -xvf MySQL-5.6.22-1.el6.i686.rpm-bundle.tar -C /root/mysql
  4. 安裝依賴包
    yum -y install libaio.so.1 libgcc_s.so.1 libstdc++.so.6 libncurses.so.5 –
    setopt=protected_multilib=false
    yum update libstdc+±4.4.7-4.el6.x86_64
  5. 安裝 mysql-client
    rpm -ivh MySQL-client-5.6.22-1.el6.i686.rpm
  6. 安裝 mysql-server
    rpm -ivh MySQL-server-5.6.22-1.el6.i686.rpm

1.2啟動
service mysql start
service mysql stop
service mysql status
service mysql restart

1.3登入
mysql -u root -p

修改密碼
set password = password(‘itcast’);
授權遠端訪問 :
grant all privileges on . to ‘root’ @’%’ identified by ‘itcast’;
flush privileges;

1.4Linux防火牆
service iptables status
service iptable stop
service iptables start

1.5 rpm使用
1.安裝軟體:執行rpm -ivh rpm包名,如:
#rpm -ivh apache-1.3.6.i386.rpm
2.升級軟體:執行rpm -Uvh rpm包名。

3.反安裝:執行rpm -e rpm包名。
4.查詢軟體包的詳細資訊:執行rpm -qpi rpm包名
5.查詢某個檔案是屬於那個rpm包的:執行rpm -qf rpm包名
6.查該軟體包會向系統裡面寫入哪些檔案:執行 rpm -qpl rpm包名
7,檢視某個包是否被安裝 rpm -qa | grep XXXX(moudle name)

二、索引

1、概述
MySQL官方定義為:索引是幫助MySQL高效獲取資料的資料結構。除了資料之外,資料庫還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式指向資料,這樣就可以在這些資料結構上實現高階查詢演算法,這種資料結構就是索引。
在這裡插入圖片描述
一般來說,索引也很大,不可能全部儲存在記憶體中,因此索引常常以索引檔案的形式儲存在磁碟上。索引是資料庫用來提高效能的常用工具。
2、優劣勢
優勢:
類似書籍的目錄,減少查詢次數,降低計算機IO成本。
劣勢:
索引表也要佔用空間。
資料庫進行插入、修改、刪除操作時,MySQL不僅要更新資料還要維護索引。
3、索引結構
索引是在儲存引擎層面實現的,所以不同儲存引擎會有不同的索引結構。MySQL支援4中索引形式。

  • BTREE 索引 : 最常見的索引型別,大部分索引都支援 B 樹索引。
  • HASH 索引:只有Memory引擎支援 , 使用場景簡單 。
  • R-tree 索引(空間索引):空間索引是MyISAM引擎的一個特殊索引型別,主要用於地理空間資料型別,通常使用較少,不做特別介紹。
  • Full-text (全文索引) :全文索引也是MyISAM的一個特殊索引型別,主要用於全文索引,InnoDB從Mysql5.6版本開始支援全文索引。
    在這裡插入圖片描述
    平時所說的索引沒有特殊說明,都是指B+樹索引(多路搜尋樹,並不一定是二叉的)。其中聚集索引、複合索引、字首索引、唯一索引預設都是使用 B+tree 索引,統稱為 索引。
    3.1 Btree
    BTree又叫多路平衡搜尋樹,一顆m叉的BTree特性如下:
  • 樹中每個節點最多包含 m個孩子。
  • 除根節點與葉子節點外,每個節點至少有 [ceil(m/2)]個孩子。
  • 若根節點不是葉子節點,則至少有兩個孩子。
  • 所有的葉子節點都在同一層。
  • 每個非葉子節點由 n個key與n+1個指標組成,其中[ceil(m/2)-1] <= n <= m-1
    在這裡插入圖片描述
    五叉B樹

3.2 B+樹
B+Tree為BTree的變種,B+Tree與BTree的區別為:

  • n叉B+Tree最多含有n個key,而BTree最多含有n-1個key。
  • B+Tree的葉子節點儲存所有的key資訊,依key大小順序排列。
  • 所有的非葉子節點都可以看作是key的索引部分
    在這裡插入圖片描述
    由於B+樹只有葉子節點儲存key資訊,所以每次查詢都要從root走到葉子,因此查詢效率也更加穩定。
    3.3 MySQL中的B+樹
    MySQL索引資料結構對經典的B+樹進行了優化。在苑B+樹的基礎上增加了一個指向相鄰葉子節點的指標,這樣就形成了帶有順序指標的B+樹。這樣方便了範圍搜尋。
    在這裡插入圖片描述
    3.4 索引分類
  • 單值索引:一個索引只包含一個列,一張表可以有多個單值索引。
  • 唯一索引:索引列的值必須唯一,允許有null值。
  • 複合索引:一個索引包含多個列。

3.5 索引語法
1.建立索引
create index idx_city_name on city(city_name);
組合索引
create index idx_name_email_status on city(name,email,status);
2.檢視索引
show index from city;
3.刪除索引
drop index idx_city_name on city;
4.alter命令

  • alter table tb_name add primary key(column_list);
    該語句新增一個主鍵,這意味著索引值必須是唯一的,且不能為NULL
  • alter table tb_name add unique index_name(column_list);
    這條語句建立索引的值必須是唯一的(除了NULL外,NULL可能會出現多次)
  • alter table tb_name add index index_name(column_list);
    新增普通索引, 索引值可以出現多次。
  • alter table tb_name add fulltext index_name(column_list);
    該語句指定了索引為FULLTEXT, 用於全文索引

5.儲存引擎
show engines;
show create table city;
alter table city engine=innodb;

6.索引設計原則

  • 索引是為了方便查詢,所以要查詢頻率高,資料量比較大的表建立索引。
  • 索引欄位的選擇,最佳候選應當從where子句的條件中提取,應該挑選最常用、過濾效果最好的組合。
  • 儘量使用唯一索引。
  • 索引的維護頁需要成本,並不是越多越好。
  • 利用最左字首,N個列組合而成的組合索引,那麼相當於建立了N個索引。如果where子句使用了該索引的前幾個欄位,那麼這條查詢就可以利用組合索引來提升查詢效率。

三、檢視

1.檢視概述
檢視(View)是一種虛擬存在的表。檢視並不在資料庫中實際存在,行和列資料來自定義檢視的查詢中使用的表,並且是在使用檢視時動態生成的。通俗的講,檢視就是一條SELECT語句執行後返回的結果集。
2.建立或修改檢視
建立檢視
CREATE or replace VIEW view_city_country AS SELECT c.*,t.country_name FROM city c,country t WHERE c.country_id=t.country_id;
查詢檢視
SELECT * FROM view_city_country;
SHOW TABLE STATUS LIKE ‘view_city_country’;

更新檢視,實際更新的是基礎表的資料
update view_city_country set city_name=‘西安市’ where city_id=1;
修改檢視
alter view view_city_country as sql語句…。
刪除檢視
drop view if exists view_city_country;

四、儲存過程和函式

1.概述
儲存過程和函式是事先經過編譯並存儲在資料庫中的一段SQL語句的集合,使用儲存過程和函式可以減少資料在資料庫和應用伺服器中的傳輸,對於提高資料處理效率有好處。
函式必須有返回值,而儲存過程則沒有。

2.建立儲存過程
delimiter $
create procedure pro_test1()
begin
select ‘Hello Mysql’ ;
end$
delimiter ;
說明:delimiter關鍵字
該關鍵字用來宣告SQL語句的分隔符,告訴 MySQL 直譯器,該段命令是否已經結束了,mysql是否可以執行了。
預設情況下,delimiter是分號;。在命令列客戶端中,如果有一行命令以分號結束,那麼回車後,mysql將會執行該命令。

3.呼叫儲存過程
call pro_test1();

4.檢視儲存過程
– 查詢db_name資料庫中的所有的儲存過程
select name from mysql.proc where db=‘index_test’;
– 查詢儲存過程的狀態資訊
show procedure status;
– 查詢某個儲存過程的定義
show create procedure index_test.pro_test1;

5.刪除儲存過程
drop procedure if exists index_test.pro_test1;
說明:儲存過程封裝了一系列sql語句,但是不能使用 use關鍵字,也就是無法切換資料庫,只能在當前資料庫操作,否則會報錯。

6.語法

6.1變數

  • declare
    宣告區域性變數,作用範圍在begin…end塊中。
    delimiter $
    create procedure pro_test2()
    begin
    declare num int default 5;
    select num+ 10;
    end$
    delimiter ;
  • set
    DELIMITER $
    CREATE PROCEDURE pro_test3()
    BEGIN
    DECLARE NAME VARCHAR(20);
    SET NAME = ‘MYSQL’;
    SELECT NAME ;
    END$
    DELIMITER ;
  • 通過select … into 方式進行賦值操作
    DELIMITER $
    CREATE PROCEDURE pro_test4()
    BEGIN
    declare countnum int;
    select count(*) into countnum from city;
    select countnum;
    END$
    DELIMITER ;

6.2 if條件判斷

delimiter $
create procedure pro_test5()
begin
declare height int default 175;
declare description varchar(20);
if height>=180 then
set description=‘身材高挑’;
elseif height>=170 and height<180 then
set description=‘標準身材’;
else
set description =‘身材一般’;
end if;
select description;
end$
delimiter ;

6.3 傳遞引數

語法格式:
create procedure procedure_name([in/out/inout] 引數名 引數型別)

IN : 該引數可以作為輸入,也就是需要呼叫方傳入值,預設
OUT: 該引數作為輸出,也就是該引數可以作為返回值
INOUT: 既可以作為輸入引數,也可以作為輸出引數

  • in
    delimiter $
    create procedure pro_test6(in height int)
    begin
    declare description varchar(20);
    if height>=180 then
    set description=‘身材高挑’;
    elseif height>=170 and height<180 then
    set description=‘標準身材’;
    else
    set description =‘身材一般’;
    end if;
    select description;
    end$
    delimiter ;

  • out
    delimiter $
    create procedure pro_test7(in height int,out description varchar(20))
    begin
    if height>=180 then
    set description=‘身材高挑’;
    elseif height>=170 and height<180 then
    set description=‘標準身材’;
    else
    set description =‘身材一般’;
    end if;
    end$
    delimiter ;

呼叫:
call pro_test7(168,@description);
select @description;
說明:@description : 這種變數要在變數名稱前面加上“@”符號,叫做使用者會話變數,代表整個會話過程他都是有作用的,這個類似於全域性變數一樣。
@@global.sort_buffer_size : 這種在變數前加上 “@@” 符號,叫做 系統變數

6.4 case結構

delimiter $
create procedure pro_test9(month int)
begin
declare result varchar(20);
case
when month >= 1 and month <=3 then
set result = ‘第一季度’;
when month >= 4 and month <=6 then
set result = ‘第二季度’;
when month >= 7 and month <=9 then
set result = ‘第三季度’;
when month >= 10 and month <=12 then
set result = ‘第四季度’;
end case;
select concat(‘您輸入的月份為 :’,month,’,該月份為 : ’,result) as content ;
end$
delimiter ;

6.5 while結構

delimiter $
create procedure pro_test8(n int)
begin
declare total int default 0;
declare num int default 1;
while num<=n do
set total = total + num;
set num = num + 1;
end while;
select total;
end$
delimiter ;

6.6 repeat結構
有條件的迴圈控制語句,當滿足條件的時候退出迴圈 。while 是滿足條件才執行,repeat 是滿足條件就退出迴圈。
delimiter $
create procedure pro_test10(n int)
begin
declare total int default 0;
repeat
set total = total + n;
set n = n - 1;
until n=0
end repeat;
select total ;
end$
delimiter ;

6.7 loop語句
6.8 leave語句
6.9遊標

五、觸發器

1.概述
觸發器是與表有關的資料庫物件,指在insert/update/delete之前或之後,出發並執行觸發器中定義的sql語句集合。可以協助在資料庫端保證資料的完整性,日誌記錄,資料校驗等操作。
使用old或new來引用觸發器中發生變化的內容。MySQL觸發器還只支援行級觸發器,不支援語句級觸發器。oracle支援行級和語句級觸發器。
在這裡插入圖片描述
說明:如果涉及事務,觸發器和也會在事務提交時候執行。
2、建立觸發器
create trigger trigger_name
before/after insert/update/delete
on tbl_name
[ for each row ] – 行級觸發器
begin
trigger_stmt ;
end;
說明:觸發器是針對表的,不能跨資料庫操作別的表。
2.1插入
delimiter $
create trigger emp_insert_trigger
after insert
on emp
for each row
begin
insert into emp_logs values(null,‘insert’,now(),new.id,new.name);
end$
delimiter ;

2.2更新
delimiter $
create trigger emp_update_trigger
after update
on emp
for each row
begin
insert into emp_logs values(null,‘update’,concat(‘old:’,old.name,new:’,new.name));
end$
delimiter ;

2.3刪除
delimiter $
create trigger emp_delete_trigger
after delete
on emp
for each row
begin
insert into emp_logs values(null,‘delete’,old.id,old.name);
end$
delimiter ;

3、刪除觸發器
DROP TRIGGER emp_delete_trigger;

4、檢視觸發器
show triggers;