基礎階段:mysql數據的基礎操做(增刪改查),以及一些高級操做(視圖、觸發器、函數、存儲過程等),和PHP操做mysql數據庫mysql
優化階段:如何提升數據庫效率,如索引,分表等redis
部署階段:如何搭建真實的環境系統,如服務器集羣,負載均衡sql
一、什麼是數據庫?mongodb
數據庫:database,存儲數據的倉庫。
數據庫:高效存儲和處理數據的介質(介質主要是兩種:磁盤和內存)。數據庫
二、數據庫分類?apache
數據庫基於存儲介質的不一樣,可分爲兩類:
關係型數據庫(SQL)和非關係型數據庫(NoSqQL:Not Only SQL,不是關係型的數據都叫非關係型數據庫)。瀏覽器
三、不一樣的數據庫陣營中的產品有哪些?安全
關係型數據庫:
大型:Oracle,DB2
中型:SQL-SERVER,Mysql等
小型:access等服務器
非關係型數據庫:memcached,mongodb,redis(同步到磁盤,內存不運行時存儲到磁盤,解決了不安全的問題)數據結構
四、兩種數據陣營的區別?
關係型數據庫:安全(保存磁盤基本不可能丟失),符合人的思惟習慣,容易理解,比較浪費空間(二維表)
非關係型數據庫:效率高,不安全(斷電丟失)
一、什麼是關係型數據庫?
關係型數據庫:是一種創建在關係模型(數學模式)上的數據庫
關係模型:是一種所謂創建在關係上的模型,關係模型包含三個方面:
數據結構:數據存儲的問題,二維表(行和列)
操做指令集合:全部SQL語句
完整性約束:表內數據約束(字段與字段),表與表之間約束(外鍵)
二、關係型數據庫的設計?
關係型數據庫:從須要存儲的數據需求中分析,若是是一類數據(實體)應該設計成一張二維表:表是由表頭(字段名:用來規定數據的名字)和數據部分組成(實際存儲的數據單元)
二維表:行和列
表頭 |
字段名1 |
字段名2 |
數據單元 |
數據1 |
數據2 |
案例分析:分析一個教學系統,講師負責教學,教學生,在教師教學生
(1)找出系統中所存在的實體:講師表,學生表,班級表
(2)找出實體中應該存在的數據信息
a) 講師:姓名,性別,年齡,工資
b) 學生:姓名,性別,學號,學科
c) 班級:班級名字,教師編號
注:關係型數據庫:維護實體內部,實體與實體之間的聯繫
*實體內部聯繫:每一個學生都有姓名、性別、學號、學科信息
姓名 |
性別 |
學號 |
學科 |
年齡 |
陳明 |
男 |
Ictast0001 |
PHP |
20 |
陳晶晶 |
女 |
Ictast0002 |
PHP |
|
王威 |
|
Ictast0003 |
UI |
|
第二行的全部字段,都是在描述陳明這個學生(內部聯繫);第二列只能放性別(內部約束)
關係型數據庫的特色之一:若是表中對應的某個字段沒有值(數據),可是系統依然要分配空間(關係型數據庫比較浪費空間)
*實體與實體之間的聯繫:每一個學生確定屬於某個班級,每一個班級必定有多個學生(一對多)
學生表
姓名 |
性別 |
學號 |
學科 |
年齡 |
陳明 |
男 |
Ictast0001 |
PHP |
20 |
陳晶晶 |
女 |
Ictast0002 |
PHP |
|
王威 |
|
Ictast0003 |
UI |
|
班級表
班級名稱 |
教室編號 |
PHP0810 |
B205 |
PHP0710 |
A203 |
UI0710 |
B330 |
如何將學生表和班級表關聯起來?
解決方案:在學生表中增長一個班級字段,來指向班級(必須可以惟一的找到一個班級信息)
姓名 |
性別 |
學號 |
學科 |
年齡 |
班級名稱 |
陳明 |
男 |
Ictast0001 |
PHP |
20 |
PHP0810 |
陳晶晶 |
女 |
Ictast0002 |
PHP |
|
PHP0810 |
王威 |
|
Ictast0003 |
UI |
|
UI0710 |
學生實體與班級實體的關聯關係:實體與實體之間的關係
數據庫:database
數據庫系統:DBS(Database System)是一種虛擬系統,將多種內容關聯起來的稱呼
DBS = DBNS + DB
DBMS:Database Mangement System數據庫管理系統,專門管理數據庫
DBA:Database Adminstrator數據庫管理員
行/記錄:row/record,本質是一個東西:都是指表中的一行(一條記錄)
行:是從結構角度出發
記錄:是從數據角度出發
列/字段:column/field,本質是同一個東西
SQL:Structured Query Language結構化查詢語言(數據以查詢爲主,99%是在進行查詢操做)
SQL分爲三個部分
SQL是關係型數據庫的操做指令,SQL是一種約束,但不強制(相似W3C):不一樣的數據庫產品(如Oracle,mysql)內部可能會有一些細微的區別。
Mysql數據庫是一種c/s結構(客戶端/服務端)的軟件,若想訪問服務器必須經過客戶端(服務器一直運行,客戶端在須要使用的時候運行),扁平化的方式。
交互方式:
一、客戶端鏈接認證:鏈接服務器,認證身份:mysql.exe -hpup #h找主機,p端口找軟件,u用戶,p密碼
二、客戶端發送SQL指令
三、服務器接收SQL指令:處理SQL指令,返回操做結果
四、客戶端接收結果:顯示結果
五、斷開鏈接(釋放資源:服務器併發限制):exit/quit/\q
問題解決方案:'mysql' 不是內部或外部命令,也不是可運行的程序或批處理文件。
win7下進入系統環境變量設置
將安裝的mysql程序的bin文件路徑填入path變量當中,上圖是D:\mysql57\soft\bin;(記得末尾的分號)
關閉cmd後,從新登陸
服務器是C語言編譯好的結果,沒法進行反編譯,沒有辦法徹底瞭解服務器內部的內容:只能粗略的去分析數據庫服務器的內部結構。
將Mysql服務器內部對象分紅四層:系統(DBMS)——>數據庫(DB)——>數據表(Table)——>字段(field)
基本操做: CRUD
將SQL的基本操做,根據操做對象進行分類 ,分爲三類: 庫操做, 表操做(字段), 數據操做
對數據庫的增刪改查。
基本語法
Create database 數據庫名字 [庫選項];
庫選項: 用來約束數據庫, 分爲兩個選項
字符集設定: charset/character set 具體字符集(數據存儲的編碼格式): 經常使用字符集: GBK和UTF8
校對集設定: collate 具體校對集(數據比較的規則)
-- 雙中劃線 + 空格 :註釋(單行註釋),也可使用#號
-- 建立數據庫
create database mydatabase charset utf8;
其中:數據庫名字不能用關鍵字(已經被使用的字符)或者保留字(未來可能會用到的字符)
-- 建立關鍵字數據庫
create database database charset utf8;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual thatcorresponds to your MySQL server version for the right syntax to use near 'database charset utf8' at line 1
若是非要使用關鍵字或者保留字,必須使用反引號(esc鍵下面的鍵,在英文狀態下的輸出:`)
中文數據庫是能夠的,可是有前提條件: 保證服務器可以識別(建議不用)
若是建立不了,解決方案:告訴服務器當前中文的字符集是什麼
set names gbk; create database 中國3 charset utf8;
一、在數據庫系統中,增長了對應的數據庫信息
二、會在保存數據的文件夾下: Data目錄,建立一個對應數據庫名字的文件夾
三、每一個數據庫下都有一個opt文件: 保存了庫選項
一、查看全部數據庫: show databases;
show databases; -- 查看全部數據庫
二、查看指定部分的數據庫:模糊查詢
Show databases like 'pattern'; -- pattern是匹配模式
%: 表示匹配多個字符
_: 表示匹配單個字符
-- 建立數據庫
create database informationtest charset utf8;
show databases;
-- 查看以information_開始的數據庫
show databases like 'information_%';
-- 查看以information_開始的數據庫:_須要被轉義
show databases like 'information_%'; -- 至關於information%
show databases like 'information\_%';
三、查看數據庫的建立語句:
show create database 數據庫名字;
-- 查看數據庫建立語句
show create database mydatabase;
show create database database; -- 報錯,ERROR 1064 (42000):
show create database `database`; -- 關鍵字須要使用反引號
show create database 中國;
數據庫在執行SQL語句以前會優化SQL:系統保存的結果是優化的結果。
數據庫名字不能夠修改.
修改數據庫名不安全,再建立。
數據庫的修改僅限庫選項: 字符集和校對集(校對集依賴字符集)
alter database 數據庫名字 [庫選項];
charset/ character set [=] 字符集
collate 校對集
-- 修改數據庫informationtest的字符集
alter database informationtest charset GBK;
不要隨意改校對集。
全部的操做中,刪除是最簡單的。
drop database 數據庫名字;
-- 刪除數據庫
drop database informationtest;
當刪除數據庫語句執行以後,發生了什麼?
一、在數據庫內部看不到對應的數據庫
二、在對應的數據庫存儲的文件夾內: 數據庫名字對應的文件夾也被刪除(級聯刪除:裏面的數據表所有刪除)
注意:數據庫的刪除不是鬧着玩的,不要隨意刪除,應該先進行備份後操做.(刪除不可逆)
表與字段是密不可分的。
create table [if not exists] 表名(
字段名 數據類型,
字段名 數據類型 -- 最後一行不須要逗號
)[表選項];
If not exists: 若是表名不存在,那麼就建立,不然不執行建立代碼: 檢查功能
表選項: 控制表的表現
字符集: charset/character set 具體字符集; -- 保證表中數據存儲的字符集
校對集: collate 具體校對集;
存儲引擎: engine 具體的存儲引擎(innodb和myisam)
-- 建立表 create table if not exists student( name varchar(10), gender varchar(10), number varchar(10), age int )charset utf8; ERROR 1046 (3D000): No database selected
DBMS管理數據庫,數據庫管理表,沒有指定數據庫,管理不了表。
任何一個表的設計都必須指定數據庫。
方案1: 顯示的指定表所屬的數據庫
Create table 數據庫名.表名(); -- 將當前數據表建立到指定的數據庫下
-- 建立表 create table if not exists mydatabase.student( -- 顯示的將student表放到mydatabase數據庫下 name varchar(10), gender varchar(10), number varchar(10), age int )charset utf8;
方案2: 隱式的指定表所屬數據庫: 先進入到某個數據庫環境,而後建立的表自動歸屬到該指定的數據庫.
進入數據庫環境: use 數據庫名字; -- 能夠沒有分號
-- 建立數據表 -- 進入數據庫 use mydatabase; -- 建立表 create table class( name varchar(10), room varchar(10) )charset utf8;
當建立數據表的SQL指令執行以後,到底發生了什麼?
一、指定數據庫下已經存在對應的表
二、在數據庫對應的文件夾下,會產生對應表的結構文件(跟存儲引擎有關係)
數據庫能查看的方式,表均可以查看.
一、查看全部表: show tables;
-- 查看全部表
show tables;
二、查看部分表: 模糊匹配: show tables like 'pattern';
--查看以s結尾的表
show tables like '%s';
效率低(索引失效,不推薦使用)
三、查看錶的建立語句: show create table 表名;
-- 查看錶建立語句
show create table student\g -- \g ==;等價於分號
show create table student\G -- 將查到的結構旋轉90度變成縱向,字段多,折行時用
四、查看錶結構: 查看錶中的字段信息
desc/describe/show columns from 表名;
-- 查看錶結構
desc class;
describe class;
show columns from class;
表自己存在, 還包含字段,表的修改分爲兩個部分: 修改表自己和修改字段
表自己能夠修改: 表名和表選項
修改表名: rename table 老表名 to 新表名;
-- 重命名錶:student表 --> my_student(取數據庫名字前兩個字母)
rename table student to my_student;
修改表選項: 字符集,校對集和存儲引擎
alter table 表名 表選項 [=] 值;
-- 修改表選項:字符集 alter table my_student charset = GBK; show create table my_student; alter table my_student charset = GBK; show create table my_student;
字段操做不少: 新增, 修改, 重命名, 刪除
alter table 表名 add [column] 字段名 數據類型 [列屬性] [位置];
位置: 字段名能夠存放表中的任意位置
First: 第一個位置
After: 在哪一個字段以後: after 字段名; 默認的是在最後一個字段以後
desc my_student; -- 給學生表增長ID放到第一個位置 alter table my_student add column id int first; -- mysql會自動尋找分號:語句結束符 desc my_student;
修改字段: 修改一般是修改屬性或者數據類型
Alter table 表名 modify 字段名 數據類型 [屬性] [位置];
desc my_student; -- 將學生表中的number學號字段變成固定長度,且放到第二位(id以後) alter table my_student modify number char(10) after id; desc my_student;
重命名字段
Alter table 表名 change 舊字段 新字段名 數據類型 [屬性] [位置];
desc my_student; -- 修改學生表中的gender字段爲sex alter table my_student change gender sex varchar(10); desc my_student;
刪除字段
Alter table 表名 drop 字段名;
desc my_student; -- 刪除學生表中的年齡字段(age) alter table my_student drop age; desc my_student;
當心: 若是表中已經存在數據,那麼刪除字段會清空該字段的全部數據(不可逆)
Drop table 表名1,表名2...; -- 能夠一次性刪除多張表
當刪除數據表的指令執行以後發生了什麼?
注意: 刪除有危險,操做需謹慎(不可逆)
有兩種方案
方案1: 給全表字段插入數據, 不須要指定字段列表: 要求數據的值出現的順序必須與表中設計的字段出現的順序一致: 凡是非數值數據,都須要使用引號(建議是單引號)包裹
Insert into 表名 values(值列表)[,(值列表)]; -- 能夠一次性插入多條記錄
方案2: 給部分字段插入數據,須要選定字段列表: 字段列表出現的順序與字段的順序無關; 可是值列表的順序必須與選定的字段的順序一致.
Insert into 表名 (字段列表) values (值列表)[,(值列表)];
Select */字段列表 from 表名 [where條件];
查看全部數據
查看指定字段,指定條件的數據.
Update 表名 set 字段 = 值 [where條件]; -- 建議都有where: 要不是更新所有
更新不必定會成功: 如沒有真正要更新的數據
刪除是不可逆的: 謹慎刪除
Delete from 表名 [where條件];
中文數據問題本質是字符集問題.
計算機只識別二進制: 人類更可能是識別符號: 須要有個二進制與字符的對應關係(字符集)
客戶端向服務器插入中文數據: 沒有成功
緣由: \xD5\xC5\xD4\xBD表明的是"張越"在當前編碼(字符集)下對應的二進制編碼轉換成的十六進制: 兩個漢字 => 四個字節(GBK)
報錯: 服務器沒有識別對應的四個字節: 服務器認爲數據是UTF8, 一個漢字有三個字節: 讀取三個字節轉換成漢字(失敗),剩餘的再讀三個字節(不夠): 最終失敗.
全部的數據庫服務器認爲(表現)的一些特性都是經過服務器端的變量來保存: 系統先讀取本身的變量,看看應該怎麼表現.
//查看服務器到底識別哪些字符集
Show character set;
基本上: 服務器是萬能,什麼字符集都支持
//既然服務器識別這麼多: 總有一種是服務器默認的跟客戶端打交道的字符集
Show variables like 'character_set%';
問題根源: 客戶端數據只能是GBK, 而服務器認爲是UTF8: 矛盾產生
解決方案: 改變服務器, 默認的接收字符集爲GBK;
Set character_set_client = gbk;
插入中文的效果
查看數據效果: 依然是亂碼
緣由: 數據來源是服務器, 解析數據是客戶端(客戶端只識別GBK: 只會兩個字節一個漢字): 可是事實服務器給的數據倒是UTF8,三個字節一個漢字: 亂碼
解決方案: 修改服務器給客戶端的數據字符集爲GBK
Set character_set_results = GBK ;
查看數據效果
Set 變量 = 值; 修改只是會話級別(當前客戶端,當次鏈接有效: 關閉失效)
設置服務器對客戶端的字符集的認識: 可使用快捷方式: set names 字符集
Set names gbk; ====> character_set_client,character_set_results,character_set_connection
Connection鏈接層: 是字符集轉變的中間者,若是統一了效率更高,不統一也沒問題.
校對集: 數據比較的方式
校對集有三種格式
_bin: binary,二進制比較, 取出二進制位,一位一位的比較, 區分大小寫
_cs: case sensitive,大小寫敏感, 區分大小寫
_ci: case insensitice,大小寫不敏感,不區分大小寫
查看數據庫所支持的校對集: show collation;
校對集應用: 只有當數據產生比較的時候,校對集纔會生效.
對比: 使用utf8 的_bin和_ci來驗證不一樣的校對集的效果
校對集: 必須在沒有數據以前聲明好,若是有了數據,那麼再進行校對集修改: 那麼修改無效.
動態網站由三部分構成: 瀏覽器, apache服務器(PHP),數據庫服務器, 三個部分都有本身的字符集(中文), 數據須要在三個部分之間來回傳遞: 很容易產生亂碼.
如何解決亂碼問題: 統一編碼(三碼合一)
可是事實上不可能: 瀏覽器是用戶管理(根本不可能控制).
可是必需要解決這些問題: 主要靠PHP來作
---------------------------------------------------------------------------------------------------------------------
-- 雙中劃線+空格: 註釋(單行註釋),也可使用#號 -- 建立數據庫 create database mydatabase charset utf8; -- 建立關鍵字數據庫 create database database charset utf8; -- 使用反引號 create database `database` charset utf8; -- 建立中文數據庫 create database 中國 charset utf8; create database `中國` charset utf8; -- 解決方案: 告訴服務器當前中文的字符集是什麼 set names gbk; create database 中國 charset utf8; -- 查看全部數據庫 show databases; -- 建立數據庫 create database informationtest charset utf8; -- 查看以information_開始的數據庫: _須要被轉義 show databases like 'information\_%'; show databases like 'information_%'; -- 至關於information% -- 查看數據庫建立語句 show create database mydatabase; show create database `database`; -- 關鍵字須要使用反引號 -- 修改數據庫informationtest的字符集 alter database informationtest charset GBK; -- 刪除數據庫 drop database informationtest; -- 建立表 create table if not exists mydatabase.student( -- 顯示的將student表放到mydatabase數據庫下 name varchar(10), gender varchar(10), number varchar(10), age int )charset utf8; -- 建立數據表 -- 進入數據庫 use mydatabase; -- 建立表 create table class( name varchar(10), room varchar(10) )charset utf8; -- 查看全部表 show tables; -- 查看以s結尾的表 show tables like '%s'; -- 查看錶建立語句 show create table student\g -- \g ==== ; show create table student\G -- 將查到的結構旋轉90度變成縱向 -- 查看錶結構 desc class; describe class; show columns from class; -- 重命名錶: student表 -> my_student(取數據庫名字前兩個字母) rename table student to my_student; -- 修改表選項: 字符集 alter table my_student charset = GBK; -- 給學生表增長ID放到第一個位置 alter table my_student add column id int first; -- mysql會自動尋找分號: 語句結束符 -- 將學生表中的number學號字段變成固定長度,且放到第二位(id以後) alter table my_student modify number char(10) after id; -- 修改學生表中的gender字段爲sex alter table my_student change gender sex varchar(10); -- 刪除學生表中的年齡字段(age) alter table my_student drop age; -- 刪除數據表 drop table class; -- 插入數據 insert into my_student values(1,'itcast0001','Jim','male'), (2,'itcast0002','Hanmeimei','female'); -- 插入數據: 指定字段列表 insert into my_student(number,sex,name,id) values ('itcast0003','male','Tom',3), ('itcast0004','female','Lily',4); -- 查看全部數據 select * from my_student; -- 查看指定字段,指定條件數據 select id,number,sex,name from my_student where id = 1; -- 查看知足id爲1的學生信息 -- 更新數據 update my_student set sex = 'female' where name = 'jim'; -- 刪除數據 delete from my_student where sex = 'male'; -- 插入數據(中文) insert into my_student values(5,'itcast0005','張越','男'); -- 查看全部字符集 show character set; -- 查看服務器默認的對外處理的字符集 show variables like 'character_set%'; -- 修改服務器認爲的客戶端數據的字符集爲GBK set character_set_client = gbk; -- 修改服務器給定數據的字符集爲GBK set character_set_results = gbk; -- 快捷設置字符集 set names gbk; -- 查看全部校對集 show collation; -- 建立表使用不一樣的校對集 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; -- 插入數據 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 order by name; select * from my_collate_ci order by name; -- 有數據後修改校對集 alter table my_collate_ci collate = utf8_bin; alter table my_collate_ci collate = utf8_general_ci;