數(shù)據(jù)庫學習筆記-mysql數(shù)據(jù)庫的基本操作以及一些高級操作

〇、數(shù)據(jù)庫學習階段:

  1. 基礎階段:mysql數(shù)據(jù)庫的基本操作(增刪改查),以及一些高級操作(視圖,觸發(fā)器,函數(shù),存儲過程等)
  2. 優(yōu)化階段:提高數(shù)據(jù)庫效率,如索引,分表等
  3. 部署階段:搭建真實的環(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ù)庫

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

5、 斷開連接(釋放資源:服務器開發(fā)限制)

三種方式退出:exit / quit / \q

退出數(shù)據(jù)庫

其中的錯誤

1、cmd無法打開MySQL

解決方法:MySQL怎么配置環(huán)境變量

2、啟動MySQL報錯:ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)


未開啟MySQL服務報錯

解決方法:啟動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)

MySQL內部分層

二、SQL基本操作

基本操作:CRUD

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

2.1 庫操作

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

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

基本語法

Create database 數(shù)據(jù)庫名字 [庫選項]
創(chuàng)建數(shù)據(jù)庫

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

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

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

注:-- 雙中劃線+空格:注釋(單行注釋),也可以使用# 號

注意:數(shù)據(jù)庫名字不能用關鍵字(已經(jīng)被使用的字符)或者保留字(將來可能會用到的)

使用關鍵字創(chuàng)建數(shù)據(jù)庫報錯

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

例如:
create database `database` charset utf8;

反引號

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

set names gbk;
create database 中國 charset utf8;
創(chuàng)建中文數(shù)據(jù)庫

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

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

2、會在保留數(shù)據(jù)的文件夾下:Data 目錄,創(chuàng)建一個對應數(shù)據(jù)庫名字的文件夾

創(chuàng)建的三個數(shù)據(jù)庫

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

opt文件

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

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

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

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ù)庫要反引號

查看數(shù)據(jù)庫的創(chuàng)造語句

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ù)庫

解決方案

方案一:顯示指定表所屬的數(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)生對應表的結構文件(跟存儲引擎有關系)

產(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度旋轉變成縱向

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

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');

方式1

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

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

方式2

-- 插入數(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ù)

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

select id,number,sex,name from my_student where id =1; -- 查看滿足id=1 的學生信息

查看id為1的學生信息

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

Update 表名 set 字段 = 值 [where 條件]; --建議都有where,如果沒有就是更新全部。

-- 跟新jim的性別

update my_student set sex = 'female' where name = 'Jim';

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

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

并不是指令運行就是成功

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

刪除是不可逆的:謹慎刪除

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

delete from my_student where sex = 'male';

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

四、中文數(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來做

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容