〇、數(shù)據(jù)庫學習階段:
- 基礎階段:mysql數(shù)據(jù)庫的基本操作(增刪改查),以及一些高級操作(視圖,觸發(fā)器,函數(shù),存儲過程等)
- 優(yōu)化階段:提高數(shù)據(jù)庫效率,如索引,分表等
- 部署階段:搭建真實的環(huán)境系統(tǒng),如服務器集群,負載均衡。
本文為初級階段的完整學習筆記,學自CSDN視頻課《6天玩轉MySQL》,非常感謝平臺與作者!
學習時間:2020年2月15日一天
一、數(shù)據(jù)庫基礎
1、什么是數(shù)據(jù)庫?
數(shù)據(jù)庫:database,存儲數(shù)據(jù)的倉庫
數(shù)據(jù)庫:高效的存儲和處理數(shù)據(jù)的介質(介質主要是兩種:磁盤和內存)
2、數(shù)據(jù)庫的分類
- 數(shù)據(jù)庫基于存儲介質的不同,進行分類:關系型數(shù)據(jù)庫(SQL)和非關系型數(shù)據(jù)庫(NoSQL:Not Only SQL,不是關系型的數(shù)據(jù)庫都叫做非關系型數(shù)據(jù)庫)。
3、不同的數(shù)據(jù)庫陣營中的產(chǎn)品有哪些?
- 關系型數(shù)據(jù)庫
大型:Oracle,DB2
中型:SQL-SERVER,Mysql等
小型:access
- 非關系型數(shù)據(jù)庫
memcached,mongodb,redis(同步到磁盤)
4、兩種數(shù)據(jù)庫陣營的區(qū)別?
- 關系型數(shù)據(jù)庫:安全(保存磁盤基本不可能丟失),容易理解,比較浪費空間(二維表)
- 非關系型數(shù)據(jù)庫:效率高,不安全(斷電丟失)
1.1 關系型數(shù)據(jù)庫
1、什么是關系型數(shù)據(jù)庫?
關系型數(shù)據(jù)庫:是一種建立在關系模型(數(shù)學模型)上的數(shù)據(jù)庫。
關系模型:一種所謂建立在關系上的模型,關系模型包含三個方面:
數(shù)據(jù)結構:數(shù)據(jù)存儲結果,二維表(有行和列)
操作指令集合:所有的SQL語句
完整性約束:表內數(shù)據(jù)約束(字段與字段),表與表之間的約束(外界)
2、關系型數(shù)據(jù)庫的設計?
關系型數(shù)據(jù)庫:從需要存儲的數(shù)據(jù)需求中分析,如果是一類數(shù)據(jù)(實體)應該設計成一張二維表,表是由表頭(字段名:用來規(guī)定數(shù)據(jù)的名字)和數(shù)據(jù)部分組成(實際存儲的數(shù)據(jù)單元)
-二維表:行和列
可參考案例“教學系統(tǒng)”
-關系型數(shù)據(jù)庫:維護實體內部,實體與實體之間的聯(lián)系。其特點之一:如果表中對應的某個字段沒有值(數(shù)據(jù)),但是系統(tǒng)依然要分配空間:關系型數(shù)據(jù)庫比較浪費空間。
1.2 關鍵字說明
數(shù)據(jù)庫:database
數(shù)據(jù)庫系統(tǒng):DBS(Database System)是一種虛擬系統(tǒng),將多種內容關聯(lián)起來的稱呼
DBS = DBMS + DB
DBMS:Database Management System,數(shù)據(jù)庫管理系統(tǒng),專門管理數(shù)據(jù)庫
DBA:Database Administrator,數(shù)據(jù)庫管理員
行/記錄:row / record ,本質上一個東西:都是指表中的一行(一條記錄):行是從結構角度出發(fā),記錄是從數(shù)據(jù)角度出發(fā)。
列/字段:column/field,本質是同一個東西。
1.3 SQL
SQL:Structured Query Language,結構化查詢語言(數(shù)據(jù)以查詢?yōu)橹鳎?9%是在進行查詢操作)
SQL分為三個部分:
DDL:Data Definition Language,數(shù)據(jù)定義語言,用來維護存儲數(shù)據(jù)的結構(數(shù)據(jù)庫,表),代表指令:create,drop,alter等。
DML:Data Manipulation Language,數(shù)據(jù)操作語言,用來對數(shù)據(jù)進行操作(數(shù)據(jù)表中的內容),代表指令:insert,delete,update等。其中DML內部又單獨進行了一個分類:DQL(Data Query Language:數(shù)據(jù)查詢語言,如select)
DCL:Data Control Language,數(shù)據(jù)控制語言,主要是負責權限管理(用戶),戴白哦指令:grant,revoke等。
SQL是關系型數(shù)據(jù)庫的操作指令,SQL是一種約束,但不強制(類似W3C);不同的數(shù)據(jù)庫產(chǎn)品(如Oracle,mysql)可能內部會有一些細微的差別。
1.4 Mysql數(shù)據(jù)庫
MySQL數(shù)據(jù)庫是一種C/S結構的軟件:客戶端/服務端,若想訪問服務器必須通過客戶端(服務器一直運行,客戶端在需要使用的時候運行)
交互方式
1、 客戶單連接認證:連接服務器,認證身份:mysql.exe -hPup
mysql.exe -hlocalhost -P3306 -uroot -p
(其中-h找主機 -P找端口軟件 -u用戶名 -p密碼)

2、 客戶端發(fā)送SQL指令
3、 服務器接收SQL指令:處理SQL指令,返回操作結果
4、 客服端接受結果:顯示結果
show databases; --查看所有數(shù)據(jù)庫

5、 斷開連接(釋放資源:服務器開發(fā)限制)
三種方式退出:exit / quit / \q

其中的錯誤
1、cmd無法打開MySQL
解決方法:MySQL怎么配置環(huán)境變量
2、啟動MySQL報錯:ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)

解決方法:啟動MySQL報錯:ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
1.5 MySql服務器對象
沒有辦法完全了解服務器內部的內容,只能粗略的去分析數(shù)據(jù)庫服務器的內部的結構。
將mysql服務器內部對象分成了四層:系統(tǒng)(DBMS)->數(shù)據(jù)庫(DB)-> 數(shù)據(jù)表(Table) -> 字段(field)

二、SQL基本操作
基本操作:CRUD
將SQL的基本操作根據(jù)操作對象進行分類(分三類):庫操作、表操作(字段)、數(shù)據(jù)操作
2.1 庫操作
對數(shù)據(jù)庫的增刪改查
2.2 新增數(shù)據(jù)庫
基本語法
Create database 數(shù)據(jù)庫名字 [庫選項]

庫選項:用來約束數(shù)據(jù)庫,分為兩個選項
字符集設定:charset/character 具體字符集(數(shù)據(jù)存儲的編碼格式):常用字符集:GBK和UTF8
校對集設定:collate 具體校對集(數(shù)據(jù)比較的規(guī)則)
注:-- 雙中劃線+空格:注釋(單行注釋),也可以使用# 號
注意:數(shù)據(jù)庫名字不能用關鍵字(已經(jīng)被使用的字符)或者保留字(將來可能會用到的)

如果非要使用關鍵字或者保留字,那么必須使用反引號(esc鍵下面的鍵在英文狀態(tài)下的輸出··)
例如:
create database `database` charset utf8;

中文數(shù)據(jù)庫是可以的,但是要有前提條件:保證服務器能夠識別(別的不用)--> 解決方案:告訴服務器當前中文的字符集是什么:
set names gbk;
create database 中國 charset utf8;

當創(chuàng)建數(shù)據(jù)庫的SQL語句執(zhí)行后,發(fā)送了什么?
1、在數(shù)據(jù)庫系統(tǒng)中,增加了相應的數(shù)據(jù)庫信息
2、會在保留數(shù)據(jù)的文件夾下:Data 目錄,創(chuàng)建一個對應數(shù)據(jù)庫名字的文件夾

3、每個數(shù)據(jù)庫下面都有一個opt文件,保存了庫選項

1.2.1 查看數(shù)據(jù)庫
1、查看所有數(shù)據(jù)庫:show databases;

2、查看指定部分的數(shù)據(jù)庫:模糊查詢
Show databases like 'pattern'; --pattern是匹配模式
%:表示匹配多個字符
_:表示匹配單個字符
例如:
-- 創(chuàng)建數(shù)據(jù)庫
create database information charset utf8;
-- 查看以information_開始的數(shù)據(jù)庫: _需要被轉義
show databases like 'information_%';
show databases like 'information_%'; --相當于information%

3、查看數(shù)據(jù)庫的創(chuàng)建語句:
show create database 數(shù)據(jù)庫名字;
show create database database; --關鍵字命名的數(shù)據(jù)庫要反引號

1.2.2 更新數(shù)據(jù)庫
數(shù)據(jù)庫名字不可以修改。
(很低版本可以修改,但高版本不可以修改,因為可修改將導致不安全)
數(shù)據(jù)庫的修改僅限庫選項:字符集和校對集(校對集以來字符集)
Alter database 數(shù)據(jù)庫名字 [庫選項]
庫選項:
Charset/character set [-] 字符集
Collate 校對集
例如:alter database informationtest charset gbk;
修改前:

修改后:

1.2.3 刪除數(shù)據(jù)庫
所有的操作中,刪除是最簡單的。
Drop database 數(shù)據(jù)庫名;
當刪除數(shù)據(jù)庫語句執(zhí)行后,發(fā)送了什么?
1、在數(shù)據(jù)庫內部看不到相應的數(shù)據(jù)庫
2、在對應的數(shù)據(jù)庫存儲的文件夾內,數(shù)據(jù)庫名字對應的文件夾也被刪除(級聯(lián)刪除:里面的數(shù)據(jù)表全部刪除)
注意:數(shù)據(jù)庫的刪除不是鬧著玩的,不要隨意刪除,應該先進行備份后操作(刪除不可逆)
2.2 表操作
表和字段是密不可分的
2.2.1 新增數(shù)據(jù)表
Create table [if not exists] 表面名(
字段名字 數(shù)據(jù)類型,
字段名字 數(shù)據(jù)類型 -- 最后一行不需要逗號
)[表選項];
if not exists: 如果表明不存在,那么就創(chuàng)建,否則不執(zhí)行創(chuàng)建代碼;檢查功能
表選項:控制表的表現(xiàn)
字符集:charset/character set 具體字符集; -- 保證表中數(shù)據(jù)存儲的字符集
校對集:collate 具體校對集;
存儲引擎:engine具體的存儲引擎(innodh和myisam)
-- 創(chuàng)建表
create table if not exists student(
name varchar(10),
gender varchar(10),
number varchar(10),
age int
)charset utf8;
運行報錯,原因:任何一個表的設計都必須指定數(shù)據(jù)庫,

解決方案
方案一:顯示指定表所屬的數(shù)據(jù)庫
Create table 數(shù)據(jù)庫名。表名(); -- 將當前數(shù)據(jù)表創(chuàng)建到指定的數(shù)據(jù)庫下

方案二:隱式的制定表所屬的數(shù)據(jù)庫:先進入到某個數(shù)據(jù)庫環(huán)境,然后這樣創(chuàng)建的表自動歸屬到某個指定的數(shù)據(jù)庫。
進入數(shù)據(jù)庫環(huán)境:use 數(shù)據(jù)庫名字;

當創(chuàng)建數(shù)據(jù)表的SQL指令執(zhí)行之后,到底發(fā)送了什么?
1、指定數(shù)據(jù)庫下已經(jīng)存在相應的表
2、在數(shù)據(jù)庫對應的文件夾下,會產(chǎn)生對應表的結構文件(跟存儲引擎有關系)

2.2.2 查看數(shù)據(jù)庫
數(shù)據(jù)庫能查看的方式表都能查看,并多出一個查看表結構的功能。
1、查看所有表:show tables;

2、查看部分表:模糊匹配:show tables like 'pattern';
例如:查看以s結尾的表
show tables like '%s';(不推薦效率低)

3、查看表創(chuàng)建語句:show create table 表名;
show create table student;
show create table student\g -- \g = ;
show create table student\G -- \G = 將查到的結構90度旋轉變成縱向

4、查看表結構:查看表中字段信息
Desc/describe/show colomns from 表名;

2.3 修改數(shù)據(jù)表
表本身存在,還包含字段:表的修改分為兩個部分:表修改本身和修改字段。
修改表本身
表本身可以修改:表名和表選項
修改表明:rename table 老表名 to 新表名;
修改表選項:字符集,校對集和存儲引擎
alter table 表名 表選項 [=] 值;
- 修改字段
字段操作很多:新增,修改,重命名,刪除

新增字段
Altertable 表名 add[column] 字段名 數(shù)據(jù)類型 [列屬性][位置];
位置:字段名可以存放表中的任意位置
First:第一個位置
After:在哪個字段之后:after 字段名;默認是在最后一個字段后
例如:給學生表增加ID放到第一個位置
alter table my_student
add column id int
first; -- mysql會自動尋找分號作為語句結束符

修改字段:修改通常是修改屬性或者數(shù)據(jù)類型
Alter table 表名 modify 字段名 數(shù)據(jù)類型 [屬性][位置];
-- 將學生表中的number學號字段變成固定長度,且d放到id后面
alter table my_student modify number char(10) after id;

重命名字段
Alter table 表名 change 舊字段 新字段名 數(shù)據(jù)類型 [屬性][位置];
-- 修改學生表中的gender字段為sex
Alter table my_student change gender sex varchar(10);

刪除字段
Alter table 表名 drop 字段名;
例如:alter table my_student drop age;
小心:如果表中已經(jīng)存在數(shù)據(jù),那么刪除字段會清空該字段的所以數(shù)據(jù)(不可逆)

2.4 刪除數(shù)據(jù)表
Drop table 表名 1,表名 2... ; -- 可以一次性刪除多張表
例如:drop table class;

當刪除數(shù)據(jù)表的指令執(zhí)行之后發(fā)送了什么?
1、在表空間中,沒有了指定的表(數(shù)據(jù)也沒有了)。
2、在數(shù)據(jù)庫對應的文件夾下,表對應的文件(與存儲引擎有關)也會被刪除。
注意:刪除有危險,操作需謹慎(不可逆)。
三、數(shù)據(jù)操作
3.1 新增數(shù)據(jù)
有兩種方案
方案1:給全表字段插入數(shù)據(jù),不需要指定字段列表,但要求數(shù)據(jù)的值出現(xiàn)的順序必須與表中設計的字段出現(xiàn)的順序一致,且凡是非數(shù)值數(shù)據(jù),都需要使用引號(建議是單引號)包裹。
Insert into 表名 values(值列表)[,(值列表)]; -- 可以一次性插入多條記錄
-- 插入數(shù)據(jù)
insert into my_student values(1,'001','Jim','male'),(2,'002','Amy','female');

方案2:給部分字段插入數(shù)據(jù),需要選定字段列表:字段列表出現(xiàn)的順序與字段的順序無關;但是值列表的順序必須與選定的字段的順序一致。
Insert into 表名 (字段列表) values (值列表)[,(值列表)];

-- 插入數(shù)據(jù):指定字段列表
insert into my_student(number,sex,name,id) values
('003','male','Tom',3),
('004','female','Lily',4);
3.2 查看數(shù)據(jù)
Select */字段列表 from 表名 [where 條件];
-- 查看所有數(shù)據(jù)
select * from my_student;

-- 查看指定字段,指定條件數(shù)據(jù)
select id,number,sex,name from my_student where id =1; -- 查看滿足id=1 的學生信息

3.3 更新數(shù)據(jù)
Update 表名 set 字段 = 值 [where 條件]; --建議都有where,如果沒有就是更新全部。
-- 跟新jim的性別
update my_student set sex = 'female' where name = 'Jim';

更新不一定會成功,如沒有真正需要更新的數(shù)據(jù)。

3.4 刪除數(shù)據(jù)
刪除是不可逆的:謹慎刪除
-- 刪除數(shù)據(jù)
delete from my_student where sex = 'male';

四、中文數(shù)據(jù)問題
中文數(shù)據(jù)問題本質是字符集問題。
計算機只識別二進制,人類更多是識別符號,需要有個二進制與字符的對應關系(字符集)
-- 插入數(shù)據(jù)(中文)
insert into my_student values(5,'005','張越','男');
客戶端向服務器插入中文數(shù)據(jù),沒有成功。
原因:漢字在當前編碼(字符集)下對應的二進制編碼換成的十六進制:兩個漢字=》四字節(jié)(GBK)
報錯:服務器沒有識別對應的四個字節(jié):服務器認為數(shù)據(jù)是UTF8,一個漢字有三個字節(jié),讀取三個字節(jié)轉換成漢字(失?。S嗟脑僮x三個字節(jié)(不夠),最終失敗。
所有的數(shù)據(jù)庫服務器表現(xiàn)的一些特性都是通過服務器的變量來保存:系統(tǒng)先讀取自己的變量,看看應該怎么表現(xiàn)。
//查看服務器到底識別哪些字符集
show character set;

基本上:服務器是萬能,什么字符集都能支持。
//既然服務器識別那么多,總有一種是服務器默認的跟客戶端打交道的字符集。
-- 查看服務器默認的對外處理的字符集
show variables like 'character_set%';

問題根源:客戶端數(shù)據(jù)只能是GBK,而服務器認為是UTF,矛盾產(chǎn)生。
解決方案:改變服務器,默認的接收字符集為GBK;
Set character_set_client = gbk;
-- 修改服務器認為的客戶端數(shù)據(jù)的字符集為GBK
Set character_set_client = gbk;

如果顯示表數(shù)據(jù),發(fā)現(xiàn)中文亂碼,這樣的原因是:數(shù)據(jù)來源是服務器,解析數(shù)據(jù)是客戶端(客戶端只識別GBK:智慧兩個字節(jié)一個漢字),但是事實服務器給的數(shù)據(jù)確實UTF8,三個字節(jié)ig漢字->亂碼
解決方式:修改服務器給定數(shù)據(jù)的字符集為GBK
set character_set_result = gbk;

Set 變量 = 值;修改只是會話級別(當前客戶端,當西連接有效,關閉失效)
設置服務器對客戶端的字符集的認識:可以使用快捷方式:set names 字符集
Set names gbk; ==> character_set_client,character_set_result,character_set_connection
Connection連接層:是字符集轉變的中間者,如果統(tǒng)一了效率更高,不同意也沒問題。
五、校對集問題
校對集:數(shù)據(jù)比較的方式
校對集有三種格式
_bin:binary,二進制比較 ,去除二進制位,一位一位的比較,區(qū)分大小寫
_cd:case sensitive,大小寫敏感,區(qū)分大小寫
_ci:case insensitice,大小寫不敏感,不區(qū)分大小寫
查看所有校對集
show collation;
默認校對集:

校對集應用:只有當數(shù)據(jù)產(chǎn)生比較的時候,校對集才會生效。
對比:使用UTF8的_bin和_ci的不同校對集;
1、-- 創(chuàng)建表使用不同的校對集
create table my_collate_bin( name char(1))charset utf8 collate utf8_bin;
create table my_collate_ci(name char(1))charset utf8 collate utf8_general_ci;
2、-- 插入數(shù)據(jù)
insert into my_collate_bin values('a'),('A'),('B'),('b');
insert into my_collate_ci values('a'),('A'),('B'),('b');
-- 查看
select * from my_collate_bin;
select * from my_collate_ci;

3、-- 比較:根據(jù)某個字段進行排序:order by 字段名 [asc|desc]; asc升序,dese降序,默認升序
-- 排序查找
select * from my_collate_bin order by name;
select * from my_collate_ci order by name;

校對集:必須在沒有數(shù)據(jù)之前聲明號,如果有了數(shù)據(jù),那么再進行校對集修改,那么修改無效。
-- 有數(shù)據(jù)后修改校對集無效
alter table my_collate_ci collate = utf8_bin;

六、Web亂碼問題
動態(tài)網(wǎng)站由三部分構成:瀏覽器,apache服務器(PHP),數(shù)據(jù)庫服務器,三個部分都有自己的字符集(中文),數(shù)據(jù)需要在三個部分之間來回傳遞,很容易產(chǎn)生亂碼。
如何解決亂碼問題:統(tǒng)一編碼(三碼合一)
但事實上不可能:瀏覽器是用戶管理(根本不可能控制)
但是必須要解決這些問題:主要靠PHP來做
