MySQL數(shù)據(jù)庫學(xué)習(xí)day1

  1. 什么是數(shù)據(jù)庫?

數(shù)據(jù)庫:database,存儲倉庫的介質(zhì)。

數(shù)據(jù)庫:高效的存儲和處理數(shù)據(jù)的介質(zhì)(介質(zhì)主要是兩種:磁盤和內(nèi)存)

  1. 數(shù)據(jù)庫的分類?

數(shù)據(jù)庫基于存儲介質(zhì)的不同:進(jìn)行了分類,分為兩類:關(guān)系型數(shù)據(jù)庫(SQL)和非關(guān)系型數(shù)據(jù)庫(NoSQL:Not Only SQL,不是關(guān)系型數(shù)據(jù)庫都叫做非關(guān)系型數(shù)據(jù)庫)

  1. 不同的數(shù)據(jù)庫陣營中的產(chǎn)品有哪些?

關(guān)系型數(shù)據(jù)庫:

大型:Oracle,DB2

中型:SQL-Server,MySQL等

小型:access等

非關(guān)系型數(shù)據(jù)庫:memcached,mongodb,redis(同步到磁盤)

  1. 兩種數(shù)據(jù)庫陣營的區(qū)別

關(guān)系型數(shù)據(jù)庫:安全(數(shù)據(jù)保存在磁盤基本不可能丟失),容易理解,比較浪費(fèi)空間(關(guān)系型數(shù)據(jù)庫其實(shí)是一個二維表,即使不存儲數(shù)據(jù)也會占用空間)。

非關(guān)系數(shù)據(jù)庫:效率高,不安全(斷電會丟失數(shù)據(jù))。

關(guān)系型數(shù)據(jù)庫

  1. 什么是關(guān)系型數(shù)據(jù)庫?

是一種建立在關(guān)系模型(數(shù)學(xué)模型)上的數(shù)據(jù)庫。

關(guān)系模型:一種所謂建立在關(guān)系上的模型。關(guān)系模型包含三個方面:

數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)存儲的問題。二維表(行和列)

操作指令集和:所有SQl語句

完整性約束:表內(nèi)數(shù)據(jù)約束(字段與字段),表與表之間約束(外鍵)
  1. 關(guān)系型數(shù)據(jù)庫的設(shè)計(jì)

關(guān)系型數(shù)據(jù)庫:從需要存儲的數(shù)據(jù)需求中分析,如果是一類數(shù)據(jù)(實(shí)體)應(yīng)該設(shè)計(jì)成一張二維表:表是由表頭(字段名:用來規(guī)定數(shù)據(jù)的名字)和數(shù)據(jù)部分組成(實(shí)際存儲的數(shù)據(jù)單元)。

表頭 字段1 字段2
數(shù)據(jù)單元 數(shù)據(jù)1 數(shù)據(jù)2

二維表:行和列

表頭 字段1 字段2
數(shù)據(jù)單元 數(shù)據(jù)1 數(shù)據(jù)2

以實(shí)際案例來進(jìn)行處理:分析一個教學(xué)系統(tǒng):講師負(fù)責(zé)教學(xué),教學(xué)生,在教室教學(xué)生。

  1. 找出系統(tǒng)中所存在的實(shí)體:講師表,學(xué)生表,班級表

  2. 找出實(shí)體中應(yīng)該存在的數(shù)據(jù)信息

    講師:姓名,性別,年齡,工資

    學(xué)生:姓名,性別,學(xué)號,學(xué)科

    班級:班級名字,教室編號

關(guān)系型數(shù)據(jù)庫:維護(hù)實(shí)體內(nèi)部,實(shí)體與實(shí)體之間的聯(lián)系。

實(shí)體內(nèi)部的聯(lián)系:每個學(xué)生都有姓名,性別,學(xué)號,學(xué)科信息

第二行的所有字段,都是在描述陳明這個學(xué)生(內(nèi)部聯(lián)系);第二列只能放性別(內(nèi)部約束)

關(guān)系型數(shù)據(jù)庫的特點(diǎn)之一:如果表中對應(yīng)的某個字段沒有值(數(shù)據(jù)),但是系統(tǒng)依然要分配空間(而且跟有數(shù)據(jù)的空間一樣大),因此關(guān)系型數(shù)據(jù)庫比較浪費(fèi)空間。

實(shí)體與實(shí)體之間的聯(lián)系:每個學(xué)生肯定屬于某個班級,每個班級一定有多個學(xué)生(一對多)

學(xué)生表:

班級表:

解決方案:在學(xué)生表中增加一個字段來指向班級(必須能夠?yàn)槲ㄒ徽业揭粋€班級信息)

學(xué)生實(shí)體與班級實(shí)體的關(guān)聯(lián)聯(lián)系:實(shí)體與實(shí)體之間的關(guān)系。

關(guān)鍵字說明

數(shù)據(jù)庫:database

數(shù)據(jù)庫系統(tǒng):DBS(System DataBase):是一種虛擬系統(tǒng),將多種內(nèi)容關(guān)聯(lián)起來的稱呼

DBS=DBMS+DB

DBMS:DataBase Management System,數(shù)據(jù)庫管理系統(tǒng),專門管理數(shù)據(jù)庫

DBA:DataBase Administrator,數(shù)據(jù)庫管理員

行/記錄:row/record,本質(zhì)是一個東西:都是指表中的一行(一條記錄):行是從結(jié)構(gòu)角度出發(fā),記錄是從數(shù)據(jù)角度從發(fā)

列/字段:column/field,本質(zhì)是一個東西。

SQL

SQL:Structured Query Language,結(jié)構(gòu)化查詢語言(數(shù)據(jù)以查詢?yōu)橹鳎?9%是在進(jìn)行查詢操作)

SQL分為三個部分

DDL:Data Definition Language,數(shù)據(jù)定義語言,用來維護(hù)存儲數(shù)據(jù)結(jié)構(gòu)(數(shù)據(jù)庫,表),代表指令:create,drop,alter等。

DML:Data Manipulation Language,數(shù)據(jù)操作語言,用來對數(shù)據(jù)進(jìn)行操作(數(shù)據(jù)表中的內(nèi)容)代表指令:insert,delete,update等:其中DML內(nèi)部又單獨(dú)進(jìn)行了一個分類:DQL(Data Query Language:數(shù)據(jù)查詢語言,如select)

DCL:Data Control Language,數(shù)據(jù)控制語言,主要是負(fù)責(zé)權(quán)限管理(用戶),代表指令:grant,revoke等。

SQl是關(guān)系型數(shù)據(jù)庫的操作指令,SQl是一種約束,但不強(qiáng)制(類似W3C):不同的數(shù)據(jù)庫產(chǎn)品(如:Oracle,MySQL)可能內(nèi)部會有細(xì)微差異。

MySQL數(shù)據(jù)庫

MySQL數(shù)據(jù)庫是一種c/s結(jié)構(gòu)的軟件:客戶端/服務(wù)端,若想訪問服務(wù)器必須通過客戶端(服務(wù)端一直運(yùn)行,客戶端在需要使用的時候運(yùn)行)。

扁平化c/s軟件:FeiQ,不嚴(yán)格區(qū)分服務(wù)端和客戶端。

支付寶曾經(jīng)服務(wù)器宕機(jī)過,卻聲稱是被挖斷網(wǎng)線,但是挖斷網(wǎng)線怎么會使整個服務(wù)器都宕機(jī)呢?

交互方式:

  1. 客戶端連接認(rèn)證:連接服務(wù)器,認(rèn)證身份:mysql.exe -hPup

  2. 客戶端發(fā)送SQl指令

  3. 服務(wù)器接收SQL:處理SQL指令:返回操作結(jié)果

  4. 客戶端接收結(jié)果:顯示結(jié)果

  5. 斷開連接(釋放資源,服務(wù)器并發(fā)限制)exit/qiut/\q

MySQL服務(wù)器對象

沒有辦法完全了解服務(wù)器內(nèi)部的內(nèi)容:只能粗略的去分析數(shù)據(jù)庫服務(wù)器的內(nèi)部的結(jié)構(gòu)將MySQL服務(wù)器內(nèi)部對象分成了四層:系統(tǒng)(DBMS)-> 數(shù)據(jù)庫(DB)-> 數(shù)據(jù)表(Table)-> 字段(field)

SQL基本操作

基本操作:CRUD

將SQL的基本操作根據(jù)操作對象進(jìn)行分類,分三類:庫操作,表操作(字段操作),數(shù)據(jù)操作

庫操作

對數(shù)據(jù)庫的增刪改查

新增數(shù)據(jù)庫

基本語法

Create database 數(shù)據(jù)庫名字 [庫選項(xiàng)];

庫選項(xiàng):用來約束數(shù)據(jù)庫,分為兩個選項(xiàng)

字符集設(shè)定:charset、character set具體字符集(數(shù)據(jù)存儲的編碼格式):常用字符集:GBK和UTF8

校對集設(shè)定:collate 具體校對集(數(shù)據(jù)比較的規(guī)則)

當(dāng)創(chuàng)建數(shù)據(jù)庫的SQL語句執(zhí)行以后,發(fā)生了什么?

  1. 在數(shù)據(jù)庫系統(tǒng)中,增加了對應(yīng)的數(shù)據(jù)庫信息

  2. 會在保存數(shù)據(jù)的文件夾下,創(chuàng)建一個對應(yīng)數(shù)據(jù)庫名字的文件夾

  3. 每個數(shù)據(jù)庫下都有一個opt文件:保存了庫選項(xiàng)

第一行是字符集

第二行是校對集,校對集依賴于字符集

查看數(shù)據(jù)庫

查看所有數(shù)據(jù)庫

  1. show databases;
  1. 查看指定部分的數(shù)據(jù)庫:模糊查詢

show databases like ‘pattern’ –pattern是匹配模式

%:表示匹配多個字符

_:表示匹配一個字符

  1. 查看數(shù)據(jù)庫創(chuàng)建語句

show create database mydatabase;

出現(xiàn)的SQL語句跟我們創(chuàng)建數(shù)據(jù)庫時候的SQL語句不一樣,是由于數(shù)據(jù)庫在執(zhí)行SQL語句之前會優(yōu)化;系統(tǒng)保存的結(jié)果是優(yōu)化后的結(jié)果

更新數(shù)據(jù)庫

數(shù)據(jù)庫名字不可以修改

數(shù)據(jù)庫的修改僅限于庫選項(xiàng):字符集和校對集(校對集依賴于字符集,一般不建議修改校對集)

alter database 數(shù)據(jù)庫名字[庫選項(xiàng)];

charset/character set [=] 字符集

collate 校對集

修改字符集的同時會修改校對集

刪除數(shù)據(jù)庫

所有的操作中:刪除是最簡單的

drop database 數(shù)據(jù)庫名字;

當(dāng)刪除數(shù)據(jù)庫語句執(zhí)行之后,發(fā)生了什么?

  1. 在數(shù)據(jù)庫內(nèi)部看不到對應(yīng)的數(shù)據(jù)庫;

  2. 在對應(yīng)的數(shù)據(jù)庫存儲的文件夾內(nèi):數(shù)據(jù)庫名字對應(yīng)的文件夾也被刪除(級聯(lián)刪除:里面的數(shù)據(jù)表全部被刪除)

注意:數(shù)據(jù)庫的刪除一定要進(jìn)行備份(刪除不可逆)

表操作

表與字段是密不可分的

新增數(shù)據(jù)表

create table[if not exsits] 表名 (

字段名字 數(shù)據(jù)類型,

字段名字 數(shù)據(jù)類型   --最后一行不需要逗號

)[表選項(xiàng)];

If not exsits:如果表名不存在,那么就創(chuàng)建,否則不執(zhí)行創(chuàng)建代碼:檢查功能

表選項(xiàng):控制表的表現(xiàn)

字符集:charset/character set 具體字符集;  --保證表中數(shù)據(jù)存儲的字符集

校對集:collate 具體校對集

存儲引擎:engine具體的存儲引擎(innodb 和 myisam)

出現(xiàn)上面錯誤的原因是:任何一個表的設(shè)計(jì)都必須指定數(shù)據(jù)庫

方案1:顯示的指定表所屬的數(shù)據(jù)庫

create table 數(shù)據(jù)庫名.表名(); ---將當(dāng)前數(shù)據(jù)表創(chuàng)建到指定的數(shù)據(jù)庫下

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

進(jìn)入某個數(shù)據(jù)庫環(huán)境:use 數(shù)據(jù)庫名字;(注意:可以不加分號,少數(shù))

當(dāng)創(chuàng)建數(shù)據(jù)表的SQL指令執(zhí)行之后,到底發(fā)生了什么?

  1. 指定數(shù)據(jù)庫下已經(jīng)存在對應(yīng)的表;

  2. 在數(shù)據(jù)庫對應(yīng)的文件夾下,會產(chǎn)生對應(yīng)表的結(jié)構(gòu)文件(跟存儲引擎有關(guān)系)

查看數(shù)據(jù)表

數(shù)據(jù)庫能查看的方式,表都可以查看

  1. 查看所有表:show tables;

2.查看部分表:模糊匹配:show tables like ‘pattern’

這樣模糊查詢效率比較低,由于前面是不確定,后面是確定的(相當(dāng)于索引失效了),效率高的查詢方式是前面確定,后面不確定

  1. 查看表的創(chuàng)建語句

  2. show create table 表名

show create table 表名 \g 等價于 show create table 表名;

  1. 查看表結(jié)構(gòu):查看表中的字段信息(三種方式)

desc 表名;

describe 表名;

show columns from class 表名;

修改數(shù)據(jù)表

表本身存在,還包含字段:表的修改分為兩個部分

修改表本身

表本身可以修改:表名和表選項(xiàng)

修改表名:rename table 舊表名 to 新表名;

修改表選項(xiàng):字符集、校對集、存儲引擎(innodb,myisam)

alter table 表名 表選項(xiàng) [=] 值;

修改字段

字段操作有很多:新增,修改,重名,刪除

新增字段:

alter table 表名 add [column] 字段名 數(shù)據(jù)類型 [列屬性][位置];

位置:字段名可以存放在表中的任意位置

first:第一個位置

after: 在哪個字段之后,after字段名:默認(rèn)是在最后一個字段之后

修改字段:(通常是修改屬性或者數(shù)據(jù)類型)

alter table 表名 modify 字段名 數(shù)據(jù)類型[屬性][位置];

重命名字段:

alter table 表名 change 舊字段名 新字段名 數(shù)據(jù)類型[屬性][位置];

刪除字段:

alter table 表名 drop 字段名;

注意:刪除字段后,數(shù)據(jù)也會被刪除(而且操作不可逆)

刪除數(shù)據(jù)表

drop table 表名1, 表名2;可以一次性刪除多張表

刪除數(shù)據(jù)表發(fā)生了哪些操作?

  1. 在表空間中,沒有了指定的表(數(shù)據(jù)也沒有了)

  2. 數(shù)據(jù)庫對應(yīng)的文件夾下,表對應(yīng)的文件(與存儲引擎有關(guān))也會被刪除

注意:刪除有危險(xiǎn),操作需謹(jǐn)慎(不可逆)

數(shù)據(jù)操作

新增數(shù)據(jù)

有兩種方案:

方案1:給全表字段插入數(shù)據(jù),不需要指定字段列表:要求數(shù)據(jù)的值出現(xiàn)的順序必須與表中設(shè)計(jì)的字段出現(xiàn)的順序一致:凡是非數(shù)值數(shù)據(jù),都需要使用引號(建議單引號)包裹:

insert into 表名 values (值列表)[,(值列表)]; ---可以一次性插入多條記錄

方案2:給部分?jǐn)?shù)據(jù)插入數(shù)據(jù),需要選定字段列表:字段列表出現(xiàn)的順序與字段的順序無關(guān),但是值列表的順序必須與選定的字段的順序一致

insert into 表名 (字段列表)values(值列表)[,(值列表)];

查看數(shù)據(jù)

select */字段列表 from 表名 [where 條件];

查看所有數(shù)據(jù):

查看指定字段、指定條件數(shù)據(jù)

更新數(shù)據(jù)

update 表名 set 字段 = 值 [where=條件]; --建議都有where:不然會更新全部

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

刪除數(shù)據(jù)

刪除是不可逆的:謹(jǐn)慎刪除

delete from 表名 [where 條件];

中文數(shù)據(jù)問題

中文數(shù)據(jù)的本質(zhì)問題是字符集問題

計(jì)算機(jī)只識別二進(jìn)制:人類更多是識別符號:需要有個二進(jìn)制與字符的對應(yīng)關(guān)系(字符集)

客戶端向服務(wù)器端插入中文數(shù)據(jù):沒有成功

原因:\xD5\xC5\xD4\xBD代表的是“張?jiān)健痹诋?dāng)前編碼(字符集)下對應(yīng)的二進(jìn)制編碼轉(zhuǎn)換成的十六進(jìn)制:兩個漢字 => 四個字節(jié)(GBK)

報(bào)錯:服務(wù)器沒有識別對應(yīng)的四個字節(jié):服務(wù)器認(rèn)為數(shù)據(jù)是utf8,一個漢字有三個字節(jié):讀取三個字節(jié)轉(zhuǎn)換成漢字(失?。?,剩余的再讀三個字節(jié)(不夠):最終失敗

所有的數(shù)據(jù)庫服務(wù)器認(rèn)為(表現(xiàn))的一些特性都是通過服務(wù)器的變量保存:系統(tǒng)先讀取自己的變量,看看應(yīng)該怎么表現(xiàn):

//查看服務(wù)器到底識別哪些字符集

show character set;

基本上:服務(wù)器是萬能的,什么字符都支持

//既然服務(wù)器識別這么多:總有一種是服務(wù)器默認(rèn)的跟客戶端打交道的字符集

//查看服務(wù)器默認(rèn)的對外處理的字符集

show variables like ‘character_set%’;

問題根源:客戶端數(shù)據(jù)只能是GBK,而服務(wù)默認(rèn)是UTF8:矛盾產(chǎn)生

解決方案:改變服務(wù)器,默認(rèn)接收的字符集為GBK;

set character_set_client = GBK;

設(shè)置后插入中文數(shù)據(jù)的效果:

查看數(shù)據(jù)效果:

原因:數(shù)據(jù)來源是服務(wù)器,解析數(shù)據(jù)是客戶端(客戶端只識別GBK:只會兩個字節(jié)一個漢字):但是事實(shí)數(shù)據(jù)卻是UTF8,三個字節(jié)一個漢字:亂碼

解決方案:修改服務(wù)器給客戶端的數(shù)據(jù)字符集為GBK

set character_set_results = GBK;

查看數(shù)據(jù)效果:

set 變量 = 值;修改只是會話級別(當(dāng)前客戶端、當(dāng)次連接有效:關(guān)閉失效)

connection:連接層:是字符集轉(zhuǎn)變的中間者,如果統(tǒng)一了效率更高、不統(tǒng)一也沒問題。

校對集

校對集:數(shù)據(jù)比較的方式

校對集有三種格式:

_bin:binary,二進(jìn)制比較,取出二進(jìn)制,一位一位的比較,區(qū)分大小寫

_cs:case sensitive 大小寫敏感,區(qū)分大小寫

_ci:case insensitive 大小寫不敏感,不區(qū)分大小寫

查看數(shù)據(jù)庫支持的所有校對集:

show collation;

校對集應(yīng)用:只有當(dāng)數(shù)據(jù)產(chǎn)生比較的時候,校對集才會生效

對比:使用utf8的_bin和_ci來驗(yàn)證不同的校對集效果

  1. 創(chuàng)建不同校對集對應(yīng)的表
  1. 插入數(shù)據(jù)
  1. 比較:根據(jù)某個字段進(jìn)行排序:order by 字段名[asc/desc],asc升序,desc降序,默認(rèn)是升序

校對集:必須在沒有數(shù)據(jù)之前聲明好,如果有了數(shù)據(jù),那么再進(jìn)行校對集修改是無效的

Web亂碼問題

動態(tài)網(wǎng)站有三部分構(gòu)成:瀏覽器、Apache服務(wù)器(PHP)、數(shù)據(jù)庫服務(wù)器,三個部分都有自己的字符集(中文),數(shù)據(jù)需要在三個部分之間來回傳遞:很容易產(chǎn)生亂碼

如何解決亂碼:統(tǒng)一編碼(三碼合一)

但是事實(shí)上不可能:瀏覽器是用戶管理(根本不可能控制)

但是必須要解決這些問題:主要靠php來做

day 2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容