1. 程式人生 > 資料庫 >mysql資料庫基礎知識(超全面)

mysql資料庫基礎知識(超全面)

 安裝和配置mysql就不說了,可以借鑑這位博友的安裝過程   https://www.cnblogs.com/by330326/p/5608290.html
 
**一.mysql基本命令** 1.基礎常用命令
mysql -uroot -p密碼;(也可以不帶密碼,之後輸入) 本地登入
mysql -h 登入ip -p 埠(通常3306) -uroot -p密碼; 遠端登入
desc 表名;查看錶的各個欄位的屬性,以及自增鍵
mysqldump -u使用者  -p 資料庫名 > xx.sql; 匯出資料庫檔案,儲存
mysql -u使用者 -p密碼  資料庫名< xx.sql;匯入資料庫檔案(也可以選擇登入進去,在選擇資料庫後,使用source命令匯入資料) 2.建立命令 create user '使用者名稱' @'ip' identified by '密碼';  建立使用者
ip是指使用者登入mysql的電腦ip,可以寫%,本地寫localhost
grant 許可權(select/insert/updata/all priveleges) on 表/資料庫名 to '使用者'@'ip' identified by '密碼'; 使用者授權
drop user 使用者名稱@ip  刪除使用者
show databases;    查資料庫
show tables;      看錶
create database 資料庫名 default charset utf8;      建立資料庫
create table 表名(列名 資料型別 約束···,列名 資料型別 約束···)engine=innodb default charset=utf8   建立表
其中資料型別種類 數字(int,tinyint,smallint,float,double),字串(char(個數)varchar(個數))時間(DATE,TIME,DATETIME),列舉enum(值只能是列舉中的元素),集合set(值只能是結合元素的組合)
create table 表名(列名 資料型別 primary key auto_increment,列名 資料型別 約束···)engine=innodb default charset=utf8 建立含主鍵的表
create table 表名(列名 資料型別 primary key,列名 資料型別 constraint fk_外來鍵名 foreign key (列名[,]) references 表名2(列名[,])···)engine=innodb default charset=utf8  建立含外來鍵的表 2.查表命令 條件查詢
select * from 表名;
select 列名···from 表名;
select 列名 from 表名 where 列名(id等) >/</!= value;
select 列名,常量 from 表名; 增加一個常量列
select 列名 from 表名 where 列名 in/not in/between and value;
select 列名 from 表名 where 條件1 and 條件2;
特殊的:select 列名 from 表名 where 列名 in (select 列名(只能一列) from 表名);
select 列名 from 表名 where 列名 like 'xx%'/'%xx'/"xx_"; 查詢以xx開頭/xx結尾      %代表任意位,_代表一位
select xx,(select xx from ...) from .....  查詢條件做常量值
分頁
select 列名 from 表名 limit num; 顯示num個
select 列名 from 表名 limit num1,num2;從num1後取num2行資料,num1是起始位置,num2是個數
select 列名 from 表名 limit num1 offset num2;從num2後取num1行資料,num2是起始位置,num1是個數
排序
select * from 表名 order by 列名 desc;從大到小排序
select * from 表名 order by 列名 asc;從小到大排序
select * from 表名 order by 列名1 desc 列名2 asc; 首先遵循列1從大到小排序,遇到相同資料時,按列2從小到大排序
分組操作
select count/sum/max/min/avg(列名1),列名2 from 表名 group by 列名(通常是列名2);分組操作
select count/sum/max/min/avg(列名1),列名2 from 表名 group by 列名(通常是列名2)having 條件;分組操作後篩選 連表操作
select * from 表1 left join 表2 on 表1.列名=表2.列名;  左連線
select * from 表1 right join 表2 on 表1.列名=表2.列名;  右連線
select * from 表1 inner join 表2 on 表1.列名=表2.列名;  內連線
注意:如果超過3個表聯合操作,如果其中兩個表操作時已經改變了表結構,應該將這兩個表操作的結果作為一個臨時表再與第三個表聯合操作。
臨時表
(select * from 表名)as e
3.刪除,修改,插入命令
插入
insert into 表名(列名1,列名2···) values(值1,值2···),(值1,值2···),(值1,值2···);  插入值
insert into 表名1(列名) select 列名 from 表2; 在一個表中插入另一個表中資料
修改
update 表名 set 列名1=value1,列名2=value2 where 條件1 [and/or 條件2];
刪除
delete from 表名; 清除表(如果有自增id,id 不會重新開始)
delete from 表名 where 條件; 清除特定資料
truncate table 表名;清除表(如果有自增id,id 會重新開始)
4.修改表結構
alter table 表名 auto_increment=value;設定自增鍵起始值;
alter table 表名 drop 列名;刪除列
alter table 表名 add 列名 資料型別 約束; 增加列
alter table 表名 change 舊列名 新列名 資料型別;   修改欄位型別
alter table 表名 modify 列名 資料型別;   修改資料型別
alter table 舊錶名 rename 新表名; 修改表名
alter table 表名 drop primary key; 刪除表中主鍵
alter table 表名 add 列名 資料型別 primary key;新增主鍵
alter table 表名 add primary key(列名);設定主鍵
alter table 表名 add column 列名 資料型別 after 列名;在某一列後新增主鍵 **二.mysql進階** 1.外來鍵
外來鍵適用於一對多,一對一,多對多三種情況
一對多
典型案例員工與部門,一個部門對應於多個員工,一個員工對應於一個部分,所以要在員工表中設定部門id列,並設定為外來鍵,與部門表id關聯。
一對一
案例部落格園使用者與部落格,不是每個使用者都寫部落格,寫部落格的使用者與擁有的部落格地址一一對應,所以在部落格使用者表user中設定blog_id,設定成外來鍵和唯一索引,與部落格表blog中id關聯
create table user(id int not null auto_increment primary key,name char(10), blog_id int,unique uq1(blog_id),constraint fk_user_blog foreign key(blog_id) references blog(id))engine=innodb default charset=utf8;
多對多
典型案例電腦與使用者,一個使用者可以使用多臺電腦,一臺電腦對應多個使用者,多對多,此時一般選擇新建一個表contact,在其中設定兩個外來鍵,同時關聯使用者表id與電腦表id
create table contact(id int not null auto_increment primary key,user_id int,computer_id int,unique uq2(user_id,computer_id),constraint fk_user foreign key(user_id) references user(id),constraint fk_user foreign key(computer_id) references computer(id))engine=innodb default charset=utf8;
可以看情況決定要不要把兩個外來鍵弄成聯合唯一索引。
2.自增
show create table 表名 [\G];查看錶的建立資訊
對於自增鍵,我們可以設定它的初始值以及與自增步長
alter table auto_increment=value;設定自增初始值
對於自增步長有兩種型別:
第一種:基於會話級別(只對本次登入有效)
show session variables like "auto_incre%";    檢視步長
set session auto_increment_increment=value;  改變步長
set session auto_increment_offest=value;  設定起始值(不常用,因為有之前的alter)
第二種:基於全域性級別(對所有會話都有用)
set global auto_increment_increment=value; 設定全域性步長 **3.pymysql** pymysql 是python第三方模組,主要用於python與mysql互動。
pymysql 方法:
connect(host=,user=,passwd=,database=) 連線資料庫
cursor() 建立遊標
execute(sql)執行sql語句
fetchone()從查詢結果中取出一條資料
fetchmany(num)從查詢結果中取出num條資料
fetchall()從查詢結果中取出所有資料
commit() 改變(updata,insert,drop)資料庫內容專用,execute sql語句後必須commit才能真正改變資料庫
close()注意最後有兩個close,遊標要關閉,連線也要關閉
sql注入
sql注入就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令。
例項如下:
假設我們輸入使用者名稱和密碼,然後登入資料庫,在資料庫中查詢使用者和密碼是否存在,存在即登入成功,否則登入失敗 程式如上,一開始我們輸入資料庫存在的使用者和密碼,自然能夠登入成功 輸入錯誤使用者和密碼,也能成功 追究其原有,原因出在sql語句字串拼接上,拼接的字串為 ‘’ or 1=1 -- ‘‘ and passwd='123',有1=1,當然成立
解決辦法:將要拼接的內容放入execute括號中,由其自己拼接
檢視
檢視是一種虛擬存在的表,本身不包含資料,作為一個select語句儲存在資料庫中。通俗的講檢視代表的是一條select語句產生的結果集。
create view 檢視名稱 as select語句; 建立檢視
檢視單獨不能插入,修改資料,因為檢視是虛擬的。但可以修改select語句,改變檢視結果集。
alter view 檢視名稱 as sql語句; 修改結果集
drop view 檢視名稱; 刪除檢視 **4.索引** 定義:索引(Index)是幫助MYSQL高效獲取資料的資料結構
索引的作用:約束,加速查詢
索引種類
  普通索引:加速查詢
  主鍵索引:加速查詢;約束(主鍵不能為空,不能重複)
  唯一索引:加速查詢;約束(索引不能重複)
  組合索引:多列組成一個索引(聯合主鍵索引,聯合唯一索引,聯合普通索引)
create index 索引名 on 表名(列名[,列名]);建立[聯合]普通索引
create table 表名(列名 資料型別···index 索引名(列名[,列名])); 建立表時建立[聯合]普通索引
create unique index 索引名 on 表名(列名);建立唯一索引
create table 表名(列名 資料型別···unique 索引名(列名)); 建立表時建立唯一索引
create unique index 索引名 on 表名(列名,列名);建立聯合唯一索引
create table 表名(列名 資料型別···unique 索引名(列名,列名)); 建立表時建立聯合唯一索引
drop index 索引名 on 表名; 刪除索引
索引結構
索引一般有兩種結構:雜湊索引和BTree索引
雜湊索引
雜湊索引會產生一張索引表,把資料通過演算法換算成雜湊值,索引表儲存這些雜湊值,並在表中儲存指向資料的指標,值得注意的是索引表儲存雜湊值時打亂了原有的儲存順序。雜湊索引查詢一條資料時特別快速,優於BTree索引,但因為打亂了原有的資料順序,不支援範圍查詢與排序功能。
BTree索引
MYSQL普遍採用B+Tree結構 B+Tree所有索引資料都在葉子節點上,並且增加了順序訪問指標,每個葉子節點都有指向相鄰葉子節點的指標。BTree索引查詢單條資料的速度不如雜湊索引,但是更加適用於範圍查詢與排序,所以用的最為廣泛,引擎innodb與MyIsam都使用了BTree索引。
索引是不是越多越好?
答:不是的,索引越多,佔據的物理空間越大;索引只是加快了查詢速度,而減緩了插入和修改速度。 **5.事務** 定義:在MYSQL中,事務其實是一個最小的不可分割的工作單元,事務能保證一個業務的完整性。
場景:在開發中,有多條語句可能會有同時成功的要求,如果只有一部分成功,則全部失敗,回滾到原來的狀態。
mysql中如何控制事務
通過select @@autocommit;語句查詢自動提交是否開啟,1表示開啟,0表示沒有開啟
當查詢結果為1時,自動提交開啟,執行sql語句(insert into,alter),系統預設提交確認,在物理表生效
當查詢結果為0時,自動提交關閉,執行sql語句,系統會等待使用者手動提交確認(commit;),否則可以撤回修改,回滾為原狀態(rollback;)
開啟事務
一般@@autocommit我們預設開啟,否則每次都需手動提交太麻煩,但當我們想開啟一個事務時應該怎麼做?
我們可以通過begin或start transaction 開啟一個事務,最後以commit;或rollback;結束一個事務。
事務的四大特性(ACID)
A 原子性:事務是最小的不可分割的工作單元
C 一致性:在一個事務中,事務前後資料的完整性必須保持一致,sql語句要麼全部成功,要麼失敗,回滾到原狀態。如銀行轉賬,總的錢數不變
I 隔離性:不同事務之間具有隔離性
D 永續性:事務一旦結束,就不可以返回,不可以rollback
mysql事務四大隔離級別
讀未提交(read uncommitted)
不可重複讀(read committed)
可重複讀(repeatable read)
序列化(serializable)
mysql事務隔離級別預設是可重複讀(repeatable-read)
select @@ global.tx_isolation;mysql(5.x版本)檢視隔離級別
set [global/session] transaction isolation level 隔離級別; 設定隔離級別
四種隔離級別導致的問題:  
髒讀:事務1讀到了事務2未提交的資料,如果事務2rollback,這些資料便是髒資料
不可重複讀:事務1對同一資料重複讀,但是另一個事務不斷修改這些資料,造成事務1每次讀到的資料不一樣
幻讀:是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的資料進行了修改,這種修改涉及到表中的全部資料行。同時,第二個事務也修改這個表中的資料,這種修改是向表中插入一行新資料。那麼,以後就會發生操作第一個事務的使用者在新開啟的事務中發現表中還有沒有修改的資料行,就好象發生了幻覺一樣(使用者1開啟事務檢視資料,然後同時有使用者2開啟事務對資料修改並提交,使用者1在當前事務沒有發現數據改變,結束事務,然後在新開啟的事務中發現了新修改的資料,這像幻覺)
注意:不可重複讀側重修改,幻讀側重插入和刪除
幻讀試驗:
設定隔離級別 開啟一個事務,查詢資料    
 重新開啟一個視窗登入,開啟事務插入資料,並commit  先前的事務查詢資料,看不到新增語句,解決了不可重複讀問題 關閉先前事務,重新查詢,查到新增資料,出現幻讀
 
 
**三.mysql重要知識點** 1.innodb與MyIsam的區別 InnoDB支援事務,而MyISAM不支援事務;
InnoDB支援行級鎖,而MyISAM支援表級鎖;
InnoDB支援MVCC(多版本併發控制), 而MyISAM不支援;
InnoDB支援外來鍵,而MyISAM不支援;
InnoDB不支援全文索引,而MyISAM支援; 2.內連線,左連線,右連線的區別 內連線:返回兩表指定列名相同的資料,如果沒有返回空。
select * from 表1 inner join 表2 on 表1.列名=表2.列名;  內連線
左連線:左邊資料全顯示,右邊表只顯示符合條件的資料,如果右邊沒有相符資料或滿足的資料少於左邊資料行,以null代替(記錄不足的地方以null代替)
select * from 表1 left join 表2 on 表1.列名=表2.列名;  左連線
右連線:與左連線相反
select * from 表1 right join 表2 on 表1.列名=表2.列名;  右連線 3.drop,delete與truncate的區別 drop直接刪掉表
truncate刪除表中資料,再插入時自增長id又從1開始
delete刪除表中資料,可以加where字句,delete刪除整個表資料時,再插入自增id不會從1開始 4.為什麼用BTree做索引結構 雜湊:雖然單詞查詢快,但是沒有順序,不適合範圍查詢
二叉樹:樹的高度不均勻,不能自平衡,查詢效率與樹的高度有關,IO代價高
紅黑樹:樹的高度隨資料量而變,IO代價高(資料量過大時,樹的深度越高,IO讀寫越頻繁)
Btree:資料很大時,不可能放在記憶體,所以放在磁碟上,BTree 每層節點數多,層數少,減少了IO讀寫次數,查詢結果更加穩定 5.主鍵 外來鍵 主鍵:資料庫表中對儲存資料物件予以唯一和完整標識的資料列或屬性的組合。一個表只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。
外來鍵:在一個表中存在的另一個表的主鍵稱此表的外來鍵。 6.varchar與char區別 char是一種固定長度的型別,varchar則是一種可變長度的型別
char 長度是固定的,不管你儲存的資料是多少他都會都固定的長度。而varchar則處可變長度
varchar(50)中50表示最多有50個字元
varchar節省空間,查詢速度沒有char速度快  7.行級鎖和表級鎖
 
表級:直接鎖定整張表,在你鎖定期間,其它程序無法對該表進行寫操作。如果你是寫鎖,則其它程序則讀也不允許
行級:僅對指定的記錄進行加鎖,這樣其它程序還是可以對同一個表中的其它記錄進行操作。